NSCache 基本上就是一個會自動移除物件來釋放記憶體的 NSMutableDictionary。無需響應記憶體警告或者使用計時器來清除快取。唯一的不同之處是鍵物件不會像 NSMutableDictionary 中那樣被複制,這實際上是它的一個優點(鍵不需要實現 NSCopying 協議)。
先列一下使用NSCache的好處
- NSCache是一個類似NSDictionary一個可變的集合。
- 提供了可設定快取的數目與記憶體大小限制的方式。
- 保證了處理的資料的執行緒安全性。
- 快取使用的key不需要是實現NSCopying的類。
- 當記憶體警告時內部自動清理部分快取資料。
NSCache的屬性與方法
@property (assign) id<NSCacheDelegate>delegate;
複製程式碼
cache物件的代理 , 用來即將清理cache的時候得到通知
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;
複製程式碼
代理方法 , 這裡面不要對cache進行改動 , 如果物件obj需要被持久化儲存的話可以在這裡進行操作
這裡面有幾種情況會導致該方法執行:
- 手動移除(removeObjectForKey)
- 快取超過設定的上線
- App不活躍
- 系統記憶體爆炸
@property BOOL evictsObjectsWithDiscardedContent;
複製程式碼
該屬性預設為True , 表示在記憶體銷燬時丟棄該物件 。
@property NSUInteger totalCostLimit;
複製程式碼
總成本數 , 用來設定最大快取數量
開始使用NSCache
//
// TDFSetPhoneNumController.m
// TDFLoginModule
//
// Created by doubanjiang on 2017/6/5.
// Copyright © 2017年 doubanjiang. All rights reserved.
//
#import "viewController.h"
@interface viewController () <NSCacheDelegate>
@property (nonatomic ,strong) NSCache *cache;
@end
@implementation viewController
- (void)viewDidLoad {
[super viewDidLoad];
[self beginCache];
}
- (void)beginCache {
for (int i = 0; i<10; i++) {
NSString *obj = [NSString stringWithFormat:@"object--%d",i];
[self.cache setObject:obj forKey:@(i) cost:1];
NSLog(@"%@ cached",obj);
}
}
#pragma mark - NSCacheDelegate
- (void)cache:(NSCache *)cache willEvictObject:(id)obj {
//evict : 驅逐
NSLog(@"%@", [NSString stringWithFormat:@"%@ will be evict",obj]);
}
#pragma mark - Getter
- (NSCache *)cache {
if (!_cache) {
_cache = [NSCache new];
_cache.totalCostLimit = 5;
_cache.delegate = self;
}
return _cache;
}
@end
複製程式碼
我們會看到以下輸出
2018-07-31 09:30:56.485719+0800 Test_Example[52839:214698] object--0 cached
2018-07-31 09:30:56.485904+0800 Test_Example[52839:214698] object--1 cached
2018-07-31 09:30:56.486024+0800 Test_Example[52839:214698] object--2 cached
2018-07-31 09:30:56.486113+0800 Test_Example[52839:214698] object--3 cached
2018-07-31 09:30:56.486254+0800 Test_Example[52839:214698] object--4 cached
2018-07-31 09:30:56.486382+0800 Test_Example[52839:214698] object--0 will be evict
2018-07-31 09:30:56.486480+0800 Test_Example[52839:214698] object--5 cached
2018-07-31 09:30:56.486598+0800 Test_Example[52839:214698] object--1 will be evict
2018-07-31 09:30:56.486681+0800 Test_Example[52839:214698] object--6 cached
2018-07-31 09:30:56.486795+0800 Test_Example[52839:214698] object--2 will be evict
2018-07-31 09:30:56.486888+0800 Test_Example[52839:214698] object--7 cached
2018-07-31 09:30:56.486995+0800 Test_Example[52839:214698] object--3 will be evict
2018-07-31 09:30:56.487190+0800 Test_Example[52839:214698] object--8 cached
2018-07-31 09:30:56.487446+0800 Test_Example[52839:214698] object--4 will be evict
2018-07-31 09:30:56.487604+0800 Test_Example[52839:214698] object--9 cached
複製程式碼
總結
經過實驗我們發現NSCache使用上價效比還是比較高的,可以在專案裡放心去用,可以提升app的效能。