iOS---NSCache的簡單使用
NSCache
NSCache 是蘋果官方提供的緩衝類,用法與 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,使用它來管理緩衝
NSCache 在系統記憶體很低時,會自動釋放一些對象
備忘:這句話源自蘋果的官方文檔,不過在模擬器中類比記憶體警告時,緩衝不會做清理動作 為了確保接收到記憶體警告時能夠真正釋放記憶體,最好調用一下 removeAllObjects 方法
NSCache 是安全執行緒的,在多線程操作中,不需要對 Cache 加鎖
NSCache 的 Key 只是做強引用,不需要實現 NSCopying 協議
屬性name delegate totalCostLimit
緩衝空間的最大總成本,超出上限會自動回收對象 預設值是 0,表示沒有限制
countLimit
能夠緩衝對象的最大數量 預設值是 0,表示沒有限制
evictsObjectsWithDiscardedContent
標示緩衝是否回收廢棄的內容 預設值是 YES,表示自動回收方法-objectForKey: 返回與索引值關聯的對象 -setObject:forKey:
在緩衝中設定指定鍵名對應的值 與可變字典不同,緩衝對象不會對鍵名做 copy 操作 0 成本 -setObject:forKey:cost:
在緩衝中設定指定鍵名對應的值,並且指定該索引值對的成本 成本 (cost) 用於計算記錄在緩衝中的所有對象的總成本
置對象並指定”成本”,成本可以自行指定啥叫成本?例子:緩衝圖片 緩衝 100 張圖片 將圖片的”寬 * 高”當作成本,映像”像素” 10M 當作緩衝成本,無論緩衝的多少張照片,只要像素值超過 10M,就自動清理 緩衝映像的時候,使用成本,比單純設定數量要科學!
(void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;
當出現記憶體警告時,或者超出緩衝的總成本上限時,緩衝會開啟一個回收過程,刪除部分元素
-removeObjectForKey:
刪除緩衝中,指定鍵名的對象
-removeAllObjects
刪除緩衝中所有對象(很可怕,最好別用)委託方法cache:willEvictObject
緩衝將要刪除對象時調用 不能在此方法中修改緩衝代碼演練
需要實現NSCacheDelegate
@interface ViewController ()
實現代理方法:
// MARK: NSCache Delegate// 當緩衝中的對象被清除的時候,會自動調用// obj 就是要被清理的對象// 提示:不建議平時開發時重寫!僅供調試使用- (void)cache:(NSCache *)cache willEvictObject:(id)obj { [NSThread sleepForTimeInterval:0.5]; NSLog(@"清除了-------> %@", obj);}
聲明NSCache變數:
@property (nonatomic, strong) NSCache *cache;
懶載入:
- (NSCache *)cache { if (_cache == nil) { _cache = [[NSCache alloc] init]; // 設定數量限制,最大限制為10 _cache.countLimit = 10; _cache.delegate = self; } return _cache;}
測試Demo:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { for (int i = 0; i < 20; ++i) { NSString *str = [NSString stringWithFormat:@"hello - %04d", i]; NSLog(@"設定 %@", str); // 添加到緩衝 [self.cache setObject:str forKey:@(i)]; } // - 查看緩衝內容,NSCache 沒有提供遍曆的方法,只支援用 key 來取值 for (int i = 0; i < 20; ++i) { NSLog(@"緩衝中----->%@", [self.cache objectForKey:@(i)]); }}
運行結果:
2015-03-25 09:27:19.953 01-NSCache演練[26010:681046] 設定 hello - 00002015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設定 hello - 00012015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設定 hello - 00022015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設定 hello - 00032015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設定 hello - 00042015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設定 hello - 00052015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設定 hello - 00062015-03-25 09:27:19.955 01-NSCache演練[26010:681046] 設定 hello - 00072015-03-25 09:27:19.955 01-NSCache演練[26010:681046] 設定 hello - 00082015-03-25 09:27:19.955 01-NSCache演練[26010:681046] 設定 hello - 00092015-03-25 09:27:19.955 01-NSCache演練[26010:681046] 設定 hello - 00102015-03-25 09:27:20.456 01-NSCache演練[26010:681046] 清除了-------> hello - 00002015-03-25 09:27:20.457 01-NSCache演練[26010:681046] 設定 hello - 00112015-03-25 09:27:20.957 01-NSCache演練[26010:681046] 清除了-------> hello - 00012015-03-25 09:27:20.957 01-NSCache演練[26010:681046] 設定 hello - 00122015-03-25 09:27:21.458 01-NSCache演練[26010:681046] 清除了-------> hello - 00022015-03-25 09:27:21.459 01-NSCache演練[26010:681046] 設定 hello - 00132015-03-25 09:27:21.959 01-NSCache演練[26010:681046] 清除了-------> hello - 00032015-03-25 09:27:21.959 01-NSCache演練[26010:681046] 設定 hello - 00142015-03-25 09:27:22.461 01-NSCache演練[26010:681046] 清除了-------> hello - 00042015-03-25 09:27:22.461 01-NSCache演練[26010:681046] 設定 hello - 00152015-03-25 09:27:22.962 01-NSCache演練[26010:681046] 清除了-------> hello - 00052015-03-25 09:27:22.962 01-NSCache演練[26010:681046] 設定 hello - 00162015-03-25 09:27:23.464 01-NSCache演練[26010:681046] 清除了-------> hello - 00062015-03-25 09:27:23.464 01-NSCache演練[26010:681046] 設定 hello - 00172015-03-25 09:27:23.965 01-NSCache演練[26010:681046] 清除了-------> hello - 00072015-03-25 09:27:23.965 01-NSCache演練[26010:681046] 設定 hello - 00182015-03-25 09:27:24.466 01-NSCache演練[26010:681046] 清除了-------> hello - 00082015-03-25 09:27:24.466 01-NSCache演練[26010:681046] 設定 hello - 00192015-03-25 09:27:24.967 01-NSCache演練[26010:681046] 清除了-------> hello - 00092015-03-25 09:27:24.967 01-NSCache演練[26010:681046] 緩衝中----->(null)2015-03-25 09:27:24.967 01-NSCache演練[26010:681046] 緩衝中----->(null)2015-03-25 09:27:24.968 01-NSCache演練[26010:681046] 緩衝中----->(null)2015-03-25 09:27:24.968 01-NSCache演練[26010:681046] 緩衝中----->(null)2015-03-25 09:27:24.968 01-NSCache演練[26010:681046] 緩衝中----->(null)2015-03-25 09:27:24.968 01-NSCache演練[26010:681046] 緩衝中----->(null)2015-03-25 09:27:24.969 01-NSCache演練[26010:681046] 緩衝中----->(null)2015-03-25 09:27:24.969 01-NSCache演練[26010:681046] 緩衝中----->(null)2015-03-25 09:27:24.969 01-NSCache演練[26010:681046] 緩衝中----->(null)2015-03-25 09:27:24.969 01-NSCache演練[26010:681046] 緩衝中----->(null)2015-03-25 09:27:24.969 01-NSCache演練[26010:681046] 緩衝中----->hello - 00102015-03-25 09:27:24.970 01-NSCache演練[26010:681046] 緩衝中----->hello - 00112015-03-25 09:27:24.970 01-NSCache演練[26010:681046] 緩衝中----->hello - 00122015-03-25 09:27:24.970 01-NSCache演練[26010:681046] 緩衝中----->hello - 00132015-03-25 09:27:24.970 01-NSCache演練[26010:681046] 緩衝中----->hello - 00142015-03-25 09:27:24.971 01-NSCache演練[26010:681046] 緩衝中----->hello - 00152015-03-25 09:27:24.971 01-NSCache演練[26010:681046] 緩衝中----->hello - 00162015-03-25 09:27:24.971 01-NSCache演練[26010:681046] 緩衝中----->hello - 00172015-03-25 09:27:24.971 01-NSCache演練[26010:681046] 緩衝中----->hello - 00182015-03-25 09:27:24.971 01-NSCache演練[26010:681046] 緩衝中----->hello - 0019
總結
通過列印結果可以知道,當超多最大成本限制的時候,會先清除緩衝中的一條資料,再存入一條新的資料。最後緩衝中只能儲存最大成本數的資料,即10條。