一步步来读懂YYMemoryCache

395 查看

1.应该先有一个设计方案

可以先看看作者的博客关于YYMemoryCache的设计思路传送门,大概可以知道,NSCache还是挺好的,读取很快,写入的时候由于key的原因稍微慢点,但是对缓存的totalCostLimit自动清除缓存却是不可控制。那么,如果对NSCache进行改造,或者站在NSCache的设计思路上,进一步提供比较快的写入速度,提供自动清除的可控性,应该会更好一点。
那么如何选材呢?从两个方面,读写速度方面,可控方面。
NSDictionary有NSCache一样需要的的key-value对,读取速度非常快。对于控制清除缓存方面可以写入由时间先后来决定,写入value的时候带上时间并放到一个队列的前面,读取的时候把该value放到最前面(MRU),清除的时候从最后面开始(LRU)。
那么这个队列应该由什么来控制呢?
我们先看看数组,内存空间连续,读取速度快,但是修改速度慢,但是现在我们需要的是修改速度比较快的就行了,读取上已经有了NSDictionary。链表是修改速度非常快的队列,存储上内存空间不连续。虽然读取的时候慢点,但是我们不需要用它来读取啊,而且链表也能停供头尾的操作,很符合LRU。
所以选定材料是,NSDictionary+双线链表+LRU+(NSCache的线程安全+内存警告处理+转入后台处理+实时limit处理)。

2.如何来封装

应该有一个类来提供外部的接口,类似于NSCache,暂且把这个叫交互层。
应该有一个内部的类来响应交互层的command,提供数据的读写,删除,也就是双向链表和字典的操作,暂且把这个叫做处理层。
应该还有一个链表节点类。组件层。


a.先来看看对外交互层这个类YYMemoryCache。
先了解下YYMemoryCache.h

再来看看YYMemoryCache实现的私有属性。


b.处理层_YYLinkedMap(链表操作)
//操作时需要主要双链表的两个链都要连好


c.组件层_YYLinkedMapNode