NSCache 是蘋果提供的一個專門用來做緩存的類,當記憶體 "不足" 或超過限制的時候,會自動清理緩存,使用時可以指定緩存的數量和成本。用法與 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,都使用它來管理緩存。
<code>- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;</code>
設定對象并指定 "成本",成本可以自行指定
例子:緩存圖檔
1、緩存 100 張圖檔
2、将圖檔的"寬 * 高"當作成本,圖像"像素",10M 當作緩存成本,無論緩存的多少張照片,隻要像素值超過 10M,就自動清理緩存圖像的時候,使用成本,比單純設定數量要科學!
NSCache 是線程安全的,在多線程操作中,不需要對 Cache 加鎖。
NSCache 的 Key 隻是做強引用,與可變字典不同,緩存對象不會對鍵名做 copy 操作,不需要實作 NSCopying 協定。
使用 NSCache 做緩存一定要保證能夠有恢複的辦法,這是能否使用 NSCache 做緩存的一個重要原則。
例如:imageCache 可以使用 NSCache ,而 downloadQueueCache 不能使用!
當超出限制之後,緩存會自動清理!緩存中的任何對象,都有可能被幹掉。
如果是圖像緩存,記憶體中沒有,會自動從沙盒加載。
如果操作被釋放,就沒有回複的管道!
這個是是否使用 NSCache 做緩存的一個重要原則,一定要保證能夠有恢複的辦法!
千萬不要清理 NSCache
一旦調用了 removeAllObjects,就無法給 cache 添加對象。
關于 NSCache 的記憶體管理,交給他自己就行!
SDWebImage 中存在同樣的問題,一旦記憶體警告,清理了記憶體之後,之後所有的圖檔都是從沙盒加載的。