前言
- 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