在开发过程中,经常使用NSMutableDictionary
来临时存储一些键值对数据,使用也挺方便,apple另外还提供了一个类似功能NSCache
,已经有dictionary了为什么再次提供一个功能重复的NSCache
类呢。
官方文档明确说明了NSCache
用于临时存储在资源不足时容易被回收的临时键值对,NSCache
有以下几个优点
NSCache
是线程安全的,在多线程下,使用NSMutableDictionary
需要用户自己加锁以保证线程安全,而NSCache
是线程安全的,在开发过程中不用而外去考虑线程问题,只需要专心考虑业务逻辑就行NSCache
当内存不足时,NSCache
能自动清理本身保存的数据,而NSMutableDictionary
需要用户主动监听内存情况手动释放。NSCache
的键key不会被复制(只是对对象进行strong引用,不是拷贝),所以key不需要实现NSCopying协议
注意:上面第二点,在模拟器中模拟不会释放
通过以上三个优点,如果需要缓存不是很重要的业务数据(如网络下载的图片等),可优先使用NSCache
属性介绍
- name名称
- delegate设置代理
totalCostLimit
:缓存空间的最大总成本,超出上限会自动回收对象,默认为0,表示没有限制(该属性和- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g
配合使用)countLimit
:能够缓存的对象的最大值。默认为0,表示无限制evictsObjectsWithDiscardedContent
标识缓存是否回收废弃的内容
方法介绍
(void)setObject:(ObjectType)obj forKey:(KeyType)key
在缓存中设置指定键名对应的值,0成本- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g
在缓存中设置指定键名对应的值,并且指定该键值对的成本,用于计算记录在缓存中所有对象的总成本,出现内存警告或者超出缓存总成本上线时,缓存会开启一个回收过程,删除部分元素- (void)removeObjectForKey:(KeyType)key
删除缓存中指定键名的对象- (void)removeAllObjects
删除缓存中所有对象
设置了totalCostLimit
时,使用 - (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g
存储的时候,如果目前存储的数据已经到达设置的总成本时,再往里面存储时,会自动执行回收数据的操作,会将前面某些存储的数据删除。可通过代理查看回收
app进入后台也会回收资源