阅读 426

iOS缓存策略——NSCache

简介

官方描述

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多次请求,减轻服务器的压力,优化客户端网络,让用户体验更良好。

NSCache源码学习地址

文章分类
iOS
文章标签