iOS - NSCache

Junyiii發表於2017-04-19

NSCache是一個類似於集合的容器,即快取。它儲存key-value對,這一點類似於NSDictionary類。
利用他可以解決一些記憶體緊張導致的問題。
AFN,SDWebImage都是用NSCache來解決快取問題

NSCache 不Copy Key

NSDictionary

NSCache的key 沒有遵循協議

- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;複製程式碼

NSCache

- (void)setObject:(ObjectType)obj forKey:(KeyType)key; // 0 cost複製程式碼

NSCache 執行緒安全

  • NSCache是執行緒安全的,我們可以在不同的執行緒中新增、刪除和查詢快取中的物件,而不需要鎖定快取區域。

NSCache 自動刪除

  • 預設500MB記憶體限制
  • countLimit:數量限制
  • totalCostLimit:cost限制(cost物件佔用的位元組數)

countLimit,totalCostLimit是不精確的

  • evictsObjectsWithDiscardedContent 快取是否自動廢棄內容已經被廢棄的物件

evictsObjectsWithDiscardedContent 和 來控制物件是否會被自動移除的機制,但是這可能只會讓你碰到更多的問題。

NSCacheDelegate

@optional
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;複製程式碼

例子

Example:

    NSCache *cache = [[NSCache alloc] init];
    cache.delegate = self;
    cache.countLimit = 10;
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"1" withExtension:@"pdf"];
    for (int i = 0; i < 10000000; i++) {
        NSData *data = [NSData dataWithContentsOfURL:url];
        [cache setObject:data forKey:[NSString stringWithFormat:@"%d",i]];
    }複製程式碼

你會發現記憶體佔用一隻在200MB維持,無論我們儲存了多少物件。

打個廣告嘿嘿
最近寫了個開源圖表框架
github.com/JunyiXie/XJ…
覺得不錯的話可以給我個star
當然也歡迎issue!
程式碼貢獻!

相關文章