|
|
51CTO旗下网站
|
|
移动端

NSCache 与libcache

《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》第7章内存:陷阱和优化技巧,本章将围绕这个话题来进行讨论。除此之外,我们将展示一些陷阱,尤其是在Objective-C 代码中经常出现的问题。本节为大家介绍NSCache 与libcache。

作者:李俊阳 等译来源:电子工业出版社|2018-07-17 17:50

NSCache 与libcache


Apple 在 Snow Leopard 中引入了一些不同寻常的缓存类型,其中包括了底层的libcache 库及基于此库构建的 Cocoa NSCache 类。NSCache 是一种类似于NSMutableDictionary 的键值存储,只是当系统检测到内存警告时,NSCache 中的内容就可能会被清除出去。NSCache 允许你尽可能多地使用可用内存来进行缓存,同时也能最大限度地降低因内存占用导致系统性能下降的概率,例如,可能会有不正当的内存警告出现,或者还可能会出现最坏的情况,即将该缓存分页到较慢的外存当中。

注意这里所说的内容抹除(evicted),只是意味着该对象会从缓存中被移除(通过发送release 命令完成),而不是说这个对象会被释放掉。这是依据正常的内存管理规则进行的,所以只有当NSCache 持有的对象引用是它的最后一个引用(本质而言,也就是这个对象未被其他任何对象所使用)时,对象才会被释放掉。

这里还有一个需要注意的小地方,就是可以像NSMutableDictionary 一样使用NSCache。但是由于缓存中的对象可能会消失,因此需要对所获取的对象进行retain操作,直到不再需要这个对象为止,这里最好是通过适当的访问器将其暂存到一个实例变量中。相反,从NSCache 中将对象删除并不意味着它会被释放掉,因为这个对象还可能会在其他地方被retain 操作所保留。

由于NSCache 的内容清除操作是异步进行的,且内容清除的时间还包括了发出清除请求的时间,不过可以在自行存储对象之前,在传输过程中使用从原子性读取访问器中引出的retain+autorelease 操作组合,来保护对象。与NSMutableDictioanry不同的是,NSCache 是线程安全的,并且其键并不会发生复制操作。

你不仅可以使用NSCache 作为NSMutableDictionary 的简单替代品,并且如果愿意的话,还可以进行更多的控制。如果对象拥有代价函数的话,那么还可以指定缓存中对象的最大开销(例如,所能使用的字节数)。如果代价函数为“1”的话,那么可以限制缓存中的对象数量。

NSCache 也可以通过NSDiscardableContent 协议来与其内部的对象进行交互(和我们前面所讨论的NSPurgeableData 实现类似),其本质上是一个单独的引用计数协议,并且还需要10.6 版本中引入的跟踪收集器才能够与NSCache 一同工作。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

计算机与网络基础知识——考点解析及模拟训练

本书是根据全国计算机技术与软件专业技术资格(水平)考试的“计算机网络管理员考试大纲”所要求的考试范围而编写的辅导用书。全书共分10章...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊