NSCache的简单使用

NSCache

NSCache 是苹果官方提供的缓存类,用法与 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,使用它来管理缓存

NSCache 在系统内存很低时,会自动释放一些对象

属性namedelegatetotalCostLimit 缓存空间的最大总成本,超出上限会自动回收对象默认值是 0,表示没有限制

countLimit

能够缓存对象的最大数量默认值是 0,表示没有限制

evictsObjectsWithDiscardedContent

标示缓存是否回收废弃的内容默认值是 YES,表示自动回收方法-objectForKey: 返回与键值关联的对象-setObject:forKey: -setObject:forKey:cost: 在缓存中设置指定键名对应的值,并且指定该键值对的成本成本 (cost) 用于计算记录在缓冲中的所有对象的总成本 置对象并指定”成本”,成本可以自行指定啥叫成本?10M 当作缓存成本,无论缓存的多少张照片,只要像素值超过 10M,就自动清理缓存图像的时候,使用成本,,比单纯设置数量要科学!

(void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;

委托方法cache:willEvictObject 缓存将要删除对象时调用不能在此方法中修改缓存代码演练

需要实现NSCacheDelegate

@interface ViewController () <NSCacheDelegate>

实现代理方法:

– (void)cache:(NSCache *)cache willEvictObject:(id)obj {[NSThread sleepForTimeInterval:0.5];NSLog(@”清除了——-> %@”, obj);}

声明NSCache变量:

@property (nonatomic, strong) NSCache *cache;

懒加载:

– (NSCache *)cache {if (_cache == nil) {_cache = [[NSCache alloc] init];// 设置数量限制,最大限制为10_cache.countLimit = 10;_cache.delegate = self;}return _cache;}

测试Demo:

– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {for (int i = 0; i < 20; ++i) {NSString *str = [NSString stringWithFormat:@”hello – %04d”, i];NSLog(@”设置 %@”, str);// 添加到缓存[self.cache setObject:str forKey:@(i)];}// – 查看缓存内容,NSCache 没有提供遍历的方法,只支持用 key 来取值for (int i = 0; i < 20; ++i) {NSLog(@”缓存中—–>%@”, [self.cache objectForKey:@(i)]);}}

运行结果:

201501-NSCache演练[26010:681046] 设置 hello – 0000201501-NSCache演练[26010:681046] 设置 hello – 0001201501-NSCache演练[26010:681046] 设置 hello – 0002201501-NSCache演练[26010:681046] 设置 hello – 0003201501-NSCache演练[26010:681046] 设置 hello – 0004201501-NSCache演练[26010:681046] 设置 hello – 0005201501-NSCache演练[26010:681046] 设置 hello – 0006201501-NSCache演练[26010:681046] 设置 hello – 0007201501-NSCache演练[26010:681046] 设置 hello – 0008201501-NSCache演练[26010:681046] 设置 hello – 0009201501-NSCache演练[26010:681046] 设置 hello – 0010201501-NSCache演练[26010:681046] 清除了——-> hello – 0000201501-NSCache演练[26010:681046] 设置 hello – 0011201501-NSCache演练[26010:681046] 清除了——-> hello – 0001201501-NSCache演练[26010:681046] 设置 hello – 0012201501-NSCache演练[26010:681046] 清除了——-> hello – 0002201501-NSCache演练[26010:681046] 设置 hello – 0013201501-NSCache演练[26010:681046] 清除了——-> hello – 0003201501-NSCache演练[26010:681046] 设置 hello – 0014201501-NSCache演练[26010:681046] 清除了——-> hello – 0004201501-NSCache演练[26010:681046] 设置 hello – 0015201501-NSCache演练[26010:681046] 清除了——-> hello – 0005201501-NSCache演练[26010:681046] 设置 hello – 0016201501-NSCache演练[26010:681046] 清除了——-> hello – 0006201501-NSCache演练[26010:681046] 设置 hello – 0017201501-NSCache演练[26010:681046] 清除了——-> hello – 0007201501-NSCache演练[26010:681046] 设置 hello – 0018201501-NSCache演练[26010:681046] 清除了——-> hello – 0008201501-NSCache演练[26010:681046] 设置 hello – 0019201501-NSCache演练[26010:681046] 清除了——-> hello – 0009201501-NSCache演练[26010:681046] 缓存中—–>(null)201501-NSCache演练[26010:681046] 缓存中—–>(null)201501-NSCache演练[26010:681046] 缓存中—–>(null)201501-NSCache演练[26010:681046] 缓存中—–>(null)201501-NSCache演练[26010:681046] 缓存中—–>(null)201501-NSCache演练[26010:681046] 缓存中—–>(null)201501-NSCache演练[26010:681046] 缓存中—–>(null)201501-NSCache演练[26010:681046] 缓存中—–>(null)201501-NSCache演练[26010:681046] 缓存中—–>(null)201501-NSCache演练[26010:681046] 缓存中—–>(null)201501-NSCache演练[26010:681046] 缓存中—–>hello – 0010201501-NSCache演练[26010:681046] 缓存中—–>hello – 0011201501-NSCache演练[26010:681046] 缓存中—–>hello – 0012201501-NSCache演练[26010:681046] 缓存中—–>hello – 0013201501-NSCache演练[26010:681046] 缓存中—–>hello – 0014201501-NSCache演练[26010:681046] 缓存中—–>hello – 0015201501-NSCache演练[26010:681046] 缓存中—–>hello – 0016201501-NSCache演练[26010:681046] 缓存中—–>hello – 0017201501-NSCache演练[26010:681046] 缓存中—–>hello – 0018201501-NSCache演练[26010:681046] 缓存中—–>hello – 0019总结

通过打印结果可以知道,当超多最大成本限制的时候,会先清除缓存中的一条数据,再存入一条新的数据。最后缓存中只能保存最大成本数的数据,即10条。

旁观者的姓名永远爬不到比赛的计分板上。

NSCache的简单使用

相关文章:

你感兴趣的文章:

标签云: