我们应该使用的NSCache

NSCache是苹果官方提供的缓存类,它的用法 NSMutableDictionary的用法很相似,NSCache使用率很广,例如在 AFNetworking 和 SDWebImage 中均使用NSCache来管理缓存。还有一个好处就是NSCache在系统内存很低时候会自动释放一些缓存内容,无需人工干预。同时NSCache还是线程安全的,在多线程中无需对NSCache进行加锁。另外NSCache的key只是做强引用,无需实现NSCopying协议。

NSCache也被设计来融合对象遵从,其中最常见的类型是NSPurgeableData,通过调用beginContentAccess 与 endContentAccess,你可以控制何时安全放弃这个对象。这不仅在你的应用运行时提供自动缓存管理,它甚至有助于你的应用被暂停。通常情况下,当内存紧张时,内存警告没有释放出足够的内存,iOS会开始杀死暂停在后台的应用。在这种情形下,你的应用没有得到delegate信息,就这样被杀死。不过如果你使用NSPurgeableData,iOS会释放这块内存给你,即使你的应用被暂停。

属性:

@property NSUInteger totalCostLimit;// limits are imprecise/not strict,缓存空间的最大总成本,超出上限会自动回收对象 默认值是 0,表示没有限制。

@property NSUInteger countLimit;// limits are imprecise/not strict,能够缓存对象的最大数量,默认值是 0,表示没有限制。

@property BOOL evictsObjectsWithDiscardedContent;//标示缓存是否回收废弃的内容,默认值是 YES,表示自动回收.

 

方法:

- (id)objectForKey:(id)key;//返回与键值关联的对象

- (void)setObject:(id)obj forKey:(id)key; // 0 cost,在缓存中设置指定键名对应的值,与可变字典不同,缓存对象不会对键名做 copy 操作0成本。

- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;//在缓存中设置指定键名对应的值,并且指定该键值对的成本,成本 (cost) 用于计算记录在缓冲中的所有对象的总成本,成本可以自行指定。

- (void)removeObjectForKey:(id)key;//删除缓存中,指定键名的对象。

- (void)removeAllObjects;//删除缓存中所有对象。

 

NSCacheDelegate

- (void)cache:(NSCache *)cache willEvictObject:(id)obj;//缓存将要删除对象时调用,不能在此方法中修改缓存。

 

代码示例:

NSCache *cache = [[NSCache alloc] init];

cache.delegate = self;

cache.countLimit = 5;//最大缓存5条

for (int i=0; i < 10; i++) {

NSString *key = [NSString stringWithFormat:@"key_%d",i];

NSString *value = [NSString stringWithFormat:@"value_%d",i];

[cache setObject:value forKey:key];

}

for (int i=0; i < 10; i++) {

NSString *key = [NSString stringWithFormat:@"key_%d",i];

NSString *value = [cache objectForKey:key];

NSLog(@"key_%d : %@",i,value);

}

 

log信息:

2015-08-12 21:58:00.748 AwnlabDemo[1029:33713] willEvictObject = value_0

2015-08-12 21:58:00.748 AwnlabDemo[1029:33713] willEvictObject = value_1

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] willEvictObject = value_2

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] willEvictObject = value_3

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] willEvictObject = value_4

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] key_0 : (null)

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] key_1 : (null)

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] key_2 : (null)

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] key_3 : (null)

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] key_4 : (null)

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] key_5 : value_5

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] key_6 : value_6

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] key_7 : value_7

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] key_8 : value_8

2015-08-12 21:58:00.749 AwnlabDemo[1029:33713] key_9 : value_9

 

延伸阅读:

http://nshipster.cn/nscache/

 

打赏

尊重原创内容,转载请注明出处
本文链接地址: https://www.awnlab.com/archives/103

为您推荐

发表评论

邮箱地址不会被公开。 必填项已用*标注