简介
官方描述
A mutable collection you use to temporarily store transient key-value pairs that are subject to eviction when resources are low.
一个可变的集合,用于临时存储在资源不足时易被驱逐的临时键值对。
NSCache是苹果官方提供的缓存类,用法与NSMutableDictionary的用法很相似,在AFNetworking和SDWebImage中,使用它来管理缓存。
从源码看本质
NSCache可以用内存缓存对象(比如常见的图片),相比于NSMutableDictionary,使用NSCache会有以下特点:
- NSCache是线程安全的,我们可以在不同的线程中添加、删除和查询缓存中的对象,而不需要锁定缓存区域。
- KeyType不需要实现NSCopying,一个缓存对象不会拷贝key对象。
- NSCache类结合了各种自动删除策略,以确保不会占用过多的系统内存
NSCache的属性:
delegate代理属性
totalCostLimit :缓存空间的最大成本,超出上限会自动回收对象。默认值是0没有限制。
countLimit:能够缓存对象的最大数量,默认值也是0(默认没有限制)。
(当超出缓存最大成本或数量时,NSCache会把前面的数据即最开始存的给清除掉)
evictsObjectsWithDiscardedContent:标示是否回收废弃的内容,默认值是YES(自动回收)。
复制代码
NSCache的内部实现包含:
NSMutableDictionary: 保存数据和索引
NSLock: 通过每次lock()和unlock()保证了字典读写操作的线程安全
NSCacheKey: 作为字典key的封装类,自身实现了hash和isEqual方法;即使存在没有实现Hashable的对象作为key,也可以借助NSObject提供的hashValue
NSCacheEntry: 字典value的封装类,以及包含额外信息:
cost: 记录对象占用内存空间的size值
prevByCost: 链表中的前一个对象
nextByCost: 链表中的后一个对象
复制代码
NSCache的方法:
-objectForKey:返回与键值关联的对象。
-setObject: forKey: 在缓存中设置指定键名对应的值。与可变字典不同的是,缓存对象不会对键名做copy操作 0成本
-setObject: forKey: cost: 在缓存中设置指定键名对应的值,并且指定该键值对的成本。成本cost用于计算记录在缓冲中所有对象的总成本。当出现内存警告,或者超出缓存的成本上限时,缓存会开启一个回收过程,删除部分元素。
-removeObjectForKey:删除缓存中指定键名的对象。
-removeAllObjects:删除缓存中的所有对象。
复制代码
NSCache的用法
-
NSCache在系统发出低内存通知时,会自动删除缓存。
例如当不断给NSCache填充数据时,应用内存会越来越大,当大小在500M左右时,系统抛出Received memory warning ,此时查看内存,发现内存会减少,因为NSCache在内存警报时,会自动删除缓存。
-
NSCache可以设置数量限制和大小设置,countLimit设置数量限制的, totalCostLimit是设置大小的,不过平时基本不用,而且计算也麻烦。
-
设置代理
- (void)cache:(NSCache *)cache willEvictObject:(id)obj {
NSLog(@"%@",obj);
}
复制代码
NSCache 与NSURLCache
NSCache和NSURLCache一点关系也没有
使用NSURLCache缓存的目的是为了使应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来,以空间换取时间,减少对同一个url多次请求,减轻服务器的压力,优化客户端网络,让用户体验更良好。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END