有人可以举例说明如何使用NSCache
来缓存字符串吗?
或者任何人都有一个很好的解释链接?我似乎无法找到任何......
答案 0 :(得分:133)
您使用它的方式与使用NSMutableDictionary
的方式相同。不同之处在于,当NSCache
检测到过大的内存压力(即它缓存了太多的值)时,它会释放其中一些值以腾出空间。
如果您可以在运行时重新创建这些值(通过从Internet下载,通过计算,无论如何),那么NSCache
可能适合您的需要。如果无法重新创建数据(例如,用户输入,时间敏感等),则不应将其存储在NSCache
中,因为它会在那里被销毁。
示例,不考虑线程安全性:
// Your cache should have a lifetime beyond the method or handful of methods
// that use it. For example, you could make it a field of your application
// delegate, or of your view controller, or something like that. Up to you.
NSCache *myCache = ...;
NSAssert(myCache != nil, @"cache object is missing");
// Try to get the existing object out of the cache, if it's there.
Widget *myWidget = [myCache objectForKey: @"Important Widget"];
if (!myWidget) {
// It's not in the cache yet, or has been removed. We have to
// create it. Presumably, creation is an expensive operation,
// which is why we cache the results. If creation is cheap, we
// probably don't need to bother caching it. That's a design
// decision you'll have to make yourself.
myWidget = [[[Widget alloc] initExpensively] autorelease];
// Put it in the cache. It will stay there as long as the OS
// has room for it. It may be removed at any time, however,
// at which point we'll have to create it again on next use.
[myCache setObject: myWidget forKey: @"Important Widget"];
}
// myWidget should exist now either way. Use it here.
if (myWidget) {
[myWidget runOrWhatever];
}
答案 1 :(得分:19)
@implementation ViewController
{
NSCache *imagesCache;
}
- (void)viewDidLoad
{
imagesCache = [[NSCache alloc] init];
}
// How to save and retrieve NSData into NSCache
NSData *imageData = [imagesCache objectForKey:@"KEY"];
[imagesCache setObject:imageData forKey:@"KEY"];
答案 2 :(得分:9)
在Swift中使用NSCache缓存字符串的示例代码:
var cache = NSCache()
cache.setObject("String for key 1", forKey: "Key1")
var result = cache.objectForKey("Key1") as String
println(result) // Prints "String for key 1"
要创建单个应用程序范围的NSCache(单例)实例,您可以轻松扩展NSCache以添加sharedInstance属性。只需将以下代码放在一个名为NSCache + Singleton.swift的文件中:
import Foundation
extension NSCache {
class var sharedInstance : NSCache {
struct Static {
static let instance : NSCache = NSCache()
}
return Static.instance
}
}
然后,您可以在应用中的任何位置使用缓存:
NSCache.sharedInstance.setObject("String for key 2", forKey: "Key2")
var result2 = NSCache.sharedInstance.objectForKey("Key2") as String
println(result2) // Prints "String for key 2"
答案 3 :(得分:6)
sample Project 将示例项目中的CacheController.h和.m文件添加到项目中。在要缓存数据的类中,请输入以下代码。
[[CacheController storeInstance] setCache:@"object" forKey:@"objectforkey" ];
您可以使用此
设置任何对象[[CacheController storeInstance] getCacheForKey:@"objectforkey" ];
要追溯
重要说明:NSCache类包含各种自动删除策略。如果您希望将数据缓存为永久数据,或者您希望在特定时间see this answer中删除缓存数据。
答案 4 :(得分:1)
高速缓存的对象不应该实现NSDiscardableContent协议吗?
从NSCache类引用: 存储在NSCache对象中的常见数据类型是实现NSDiscardableContent协议的对象。将这种类型的对象存储在缓存中具有好处,因为它的内容可以在不再需要时被丢弃,从而节省内存。默认情况下,如果丢弃其内容,则会自动从缓存中删除缓存中的NSDiscardableContent对象,但可以更改此自动删除策略。如果将NSDiscardableContent对象放入缓存中,则缓存在删除时会调用discardContentIfPossible。