天天看點

NSCache 緩存

前言

  • NSCache 是蘋果提供的一個專門用來做緩存的類,當記憶體 "不足" 或超過限制的時候,會自動清理緩存,使用時可以指定緩存的數量和成本。
  • 用法與 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,都使用它來管理緩存。
- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;
           
  • 設定對象并指定 "成本",成本可以自行指定
  • 例子:緩存圖檔

    • 1、緩存 100 張圖檔
    • 2、将圖檔的"寬 * 高"當作成本,圖像"像素",10M 當作緩存成本,無論緩存的多少張照片,隻要像素值超過 10M,就自動清理緩存圖像的時候,使用成本,比單純設定數量要科學!
    • NSCache 是線程安全的,在多線程操作中,不需要對 Cache 加鎖。
    • NSCache 的 Key 隻是做強引用,與可變字典不同,緩存對象不會對鍵名做 copy 操作,不需要實作 NSCopying 協定。
    • 使用 NSCache 做緩存一定要保證能夠有恢複的辦法,這是能否使用 NSCache 做緩存的一個重要原則。
    • 例如:imageCache 可以使用 NSCache ,而 downloadQueueCache 不能使用!
    • 當超出限制之後,緩存會自動清理!緩存中的任何對象,都有可能被幹掉。
    • 如果是圖像緩存,記憶體中沒有,會自動從沙盒加載。
    • 如果操作被釋放,就沒有回複的管道!
    • 這個是是否使用 NSCache 做緩存的一個重要原則,一定要保證能夠有恢複的辦法!
  • 千萬不要清理 NSCache

    • 一旦調用了 removeAllObjects,就無法給 cache 添加對象。
    • 關于 NSCache 的記憶體管理,交給他自己就行!
    • SDWebImage 中存在同樣的問題,一旦記憶體警告,清理了記憶體之後,之後所有的圖檔都是從沙盒加載的。

1、NSCache 的使用

// 建立對象
NSCache *cache = [[NSCache alloc] init];

// 設定緩存數量限制,預設值是 0,表示沒有限制
cache.countLimit = 10;

// 設定緩存總成本限制,預設值是 0,表示沒有限制
cache.totalCostLimit = 1024 * 1024;

// 設定是否自動清理緩存,預設為 YES,表示自動清理
cache.evictsObjectsWithDiscardedContent = YES;

// 設定代理
cache.delegate = self;

// 設定緩存
/*
0 成本,與可變字典不同,緩存對象不會對鍵名做 copy 操作,隻是做強引用
*/
[cache setObject:str forKey:@(i)];

// 設定緩存
/*
指定成本
*/
[cache setObject:str forKey:@(i) cost:1024];

// 檢視緩存内容
/*
NSCache 沒有提供周遊的方法,隻支援用 key 來取值,NSCache 的 Key 隻是做強引用,不需要實作 NSCopying 協定
*/
NSString *string = [cache objectForKey:@(i)];

// 删除指定緩存
[cache removeObjectForKey:@8];

// 删除所有緩存
/*
一旦調用了 removeAllObjects,就無法給 cache 添加對象,關于 NSCache 的記憶體管理,交給他自己就行
*/
[cache removeAllObjects];

// 緩存協定方法
/*
須遵守 <NSCacheDelegate> 協定,obj 就是要被清理的對象
當緩存中的對象被清除的時候,會自動調用,不建議平時開發時重寫!僅供調試使用
*/
- (void)cache:(NSCache *)cache willEvictObject:(id)obj {

}
           

作者: CH520

繼續閱讀