iOS---NSCache的簡單使用

來源:互聯網
上載者:User

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條。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.