NSCache介绍
NSCache是苹果提供的一套缓存机制,与NSMutableDictionary可变字典的用法类似,常见于一些第三方库,比如AFNetworking,SDWebImage。
使用场景:通常用使用缓存来临时存储短时间使用但创建昂贵的对象,优化性能,避免这些对象的多次创建。
NSCache和NSMutableDictionary的区别
1、NSCache是线程安全的,不需要加线程锁,而NSMutableDictionary线程不安全,多线程访问和操作,需要我们自己设置管理。
2、NSCache的内存由系统管理,当内存不足时,NSCache会自动释放内存。
3、NSCache可以设置缓存对象数量和占用的内存大小,当缓存超出了设置,会自动释放内存。
4、NSCache是Key-Value的数据结构,其中key是强引用,不实现NSCoping协议,作为key的对象不会被拷贝。
下面介绍NSCache的属性、方法、代理
属性
countLimit: 能够缓存对象的最大数量,默认值是0,没有限制(限制是不精/不严格的)。totalCostLimit: 设置缓存占用的内存大小(限制是不精/不严格的)。
evictsObjectsWithDiscardedContent: 是否回收废弃内容,默认YES。
方法
setObject: forKey: 缓存对象。
setObject: forKey: cost: 缓存对象,并指定key值对应的成本,用于计算缓存中所有对象的总成本。
objectForKey: 通过key获得缓存对象。
removeObjectForKey: 删除指定对象removeAllObjects: 删除所有缓存对象
代理(NSCacheDelegate)
willEvictObject: 缓存对象即将被清理时调用,一般开发者用来调试,不能在此方法中修改缓存
以下场景会被调用:
1、 removeObjectForKey
2、缓存对象超过NSCache的countLimit和otalCostLimit属性设置的限制
3、App进入后台
4、系统发出内存警告
5、cache这个实例的生命周期结束前
NSCache注意点
1、当收到内存警告,而我们又调用removeAllObjects,则无法再继续往缓存中添加数据。
-(void)didReceiveMemoryWarning{
[super didReceiveMemoryWarning];
// 当收到内存警告,在这里清除缓存
[self.cache removeAllObjects];
// 如果再继续添加数据的话 会直接被删除
}
2、不提供缓存总的大小,想知道NSCache占用的内存大小,只有通过添加缓存的cost自己计算。
3、NSCache自动释放内存的算法是不确定的, 有时是按照LRU(最近最久未使用)释放,有时随机释放。
4、NSCache中的数据在APP重启后会消失,因为NSCache只是将数据保存在内存。