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,表示自动回收.
方法:
- (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