iOS---構建緩存時選用NSCache而非NSDictionary

構建緩存時使用--NSCache而非NSDictionary的理由:1.當系統(tǒng)資源將要耗盡的時候则酝,NSCache可以自動刪減緩存,而且線性刪減"最久未使用的"對象拧晕,NSCache是不是很強大十酣。但是NSDictionary就需要在系統(tǒng)發(fā)出"低內(nèi)存"通知時手工刪減緩存,還需要自己編寫相應優(yōu)先刪減內(nèi)存等一系列邏輯蚊丐。

2.NSCache是線程安全的,可以在供多個線程同時訪問NSCache但是NSDictionary就不具備此優(yōu)勢

3.NSCache對象不拷貝鍵艳吠,因為很多時候鍵都是由不支持拷貝操作的對象來充當?shù)穆蟊福虼薔SCache不會自動拷貝

要點:1.將? NSPurgeableData與NSCache搭配使用,可實現(xiàn)自動清除數(shù)據(jù)的功能昭娩,當NSPurgeableData對象所占內(nèi)存為系統(tǒng)所丟棄時凛篙,該對象也會從緩存中移除

2.如果緩存使用的得當,會使應用程序的響應速度提高栏渺。只有那些重新計算起來很費事的數(shù)據(jù)呛梆,才值得放入緩存,如通過網(wǎng)絡獲取或從磁盤讀取的數(shù)據(jù)

#import<Foundation/NSObject.h>

@class NSString;?

@protocol NSCacheDelegate;

?NS_ASSUME_NONNULL_BEGIN NS_CLASS_AVAILABLE(10_6, 4_0)?

@interface NSCache: NSObject?

{

?@private id _delegate;?

void *_private[5];?

void *_reserved;?

}?

?@property (copy) NSString *name;

?@property (nullable, assign) iddelegate;?

- (nullable ObjectType)objectForKey:(KeyType)key;//獲取緩存對象磕诊,基于鍵值對?

- (void)setObject:(ObjectType)obj forKey:(KeyType)key; // 0 cost---存儲緩存對象填物,考慮緩存的限制屬性

?- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;//-存儲緩存對象,cost是提前知道該緩存對象占用的字節(jié)數(shù)秀仲,也會考慮緩存的限制屬性融痛,推薦使用?

- (void)setObject:(ObjectType)obj forKey:(KeyType)key - (void)removeObjectForKey:(KeyType)key;?

?- (void)removeAllObjects; @property NSUInteger totalCostLimit; // limits are imprecise/not strict-設置緩存占用的內(nèi)存大小,并不是一個嚴格的限制神僵,當總數(shù)超過了totalCostLimit設定的值雁刷,系統(tǒng)會清除一部分緩存,直至總消耗低于totalCostLimit的值?

@property NSUInteger countLimit; // limits are imprecise/not strict----設置緩存對象的大小保礼,也不是一個嚴格的限制

?@property BOOL evictsObjectsWithDiscardedContent;//來標識緩存是否自動舍棄那些內(nèi)存已經(jīng)被丟棄的對象默認為YES,如果設置為YES沛励,則在對象的內(nèi)存被丟棄時舍棄對象。 @end?

@protocol NSCacheDelegate//實現(xiàn)了NSCacheDelegate代理的對象炮障,在緩存對象即將被清理的時候目派,系統(tǒng)回調(diào)代理方法如下:

@optional

- (void)cache:(NSCache *)cache willEvictObject:(id)obj;//第一個參數(shù)是當前緩存(NSCache),不要修改該對象胁赢;

第二個參數(shù)是當前將要被清理的對象企蹭,如果需要存儲該對象,可以在此操作(存入Sqlite or CoreData);該代理方法的調(diào)用會在緩存對象即將被清理的時候調(diào)用,如下場景會調(diào)用:

1. - (void)removeObjectForKey:(id)key; 手動刪除對象谅摄;

2. 緩存對象超過了NSCache的屬性限制徒河;(countLimit 和 totalCostLimit )

3. App進入后臺會調(diào)用;

4. 系統(tǒng)發(fā)出內(nèi)存警告送漠;

@end

NS_ASSUME_NONNULL_END

建議:需要使用緩存顽照,就使用系統(tǒng)的NSCache就行了

NSCache的使用:

NSData *data;

NSString *key;

NSCache *cache = [[NSCache alloc] init]; //創(chuàng)建

[cache setObject:data forKey:key]; //保存

[cache setObject:data forKey:key cost:50];//cost用于計算記錄在緩沖中所有對象的總成本。當出現(xiàn)內(nèi)存警告闽寡,或者超出緩存的成本上限時代兵,緩存會開啟一個回收過程,刪除部分元素爷狈。

cache.totalCostLimit = 100;//緩存空間的最大成本植影,超出上限會自動回收對象。默認值是0沒有限制

cache.countLimit = 100;//能夠緩存對象的最大數(shù)量淆院,默認值也是0(默認沒有限制)

cache.evictsObjectsWithDiscardedContent = YES;//標示是否回收廢棄的內(nèi)容何乎,默認值是YES(自動回收)

NSData *cacheData = [cache objectForKey:key]; //獲取

[cache removeObjectForKey:key];

[cache removeAllObjects];

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市土辩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抢野,老刑警劉巖拷淘,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異指孤,居然都是意外死亡启涯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門恃轩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來结洼,“玉大人,你說我怎么就攤上這事叉跛∷扇蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵筷厘,是天一觀的道長鸣峭。 經(jīng)常有香客問我,道長酥艳,這世上最難降的妖魔是什么摊溶? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮充石,結果婚禮上莫换,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好拉岁,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布坷剧。 她就那樣靜靜地躺著,像睡著了一般膛薛。 火紅的嫁衣襯著肌膚如雪听隐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天哄啄,我揣著相機與錄音雅任,去河邊找鬼。 笑死咨跌,一個胖子當著我的面吹牛沪么,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锌半,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼禽车,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刊殉?” 一聲冷哼從身側(cè)響起殉摔,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎记焊,沒想到半個月后逸月,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡遍膜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年碗硬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓢颅。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡恩尾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挽懦,到底是詐尸還是另有隱情翰意,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布巾兆,位于F島的核電站猎物,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏角塑。R本人自食惡果不足惜蔫磨,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望圃伶。 院中可真熱鬧堤如,春花似錦蒲列、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榔至,卻和暖如春抵赢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唧取。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工铅鲤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枫弟。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓邢享,卻偏偏與公主長得像,于是被迫代替她去往敵國和親淡诗。 傳聞我的和親對象是個殘疾皇子骇塘,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 今天來共同學習一下NSCache的相關知識,有疏忽的地方韩容,還望各位不吝賜教款违。 一、簡介 1群凶、NSCache是蘋果官...
    聽海聽心閱讀 5,875評論 0 4
  • 構建緩存時選用 NSCache 開發(fā) Mac OS X 或 iOS 應用程序時,經(jīng)常會遇到一個問題,那就是從網(wǎng)上下...
    dingzhijie閱讀 569評論 0 2
  • 今天研究SDWebimage發(fā)現(xiàn),里面使用了NSCache的一個方法setObject:forKey:cost:首...
    RealSlimAlan閱讀 2,365評論 1 6
  • 在項目中總是需要緩存一些網(wǎng)絡請求數(shù)據(jù)以減輕服務器壓力奠货,業(yè)內(nèi)也有許多優(yōu)秀的開源的解決方案。通常的緩存方案都是...
    墨隱于非閱讀 1,001評論 0 1
  • 黑夜來到人間 在異國陌生的街道 霓虹閃爍 貓奔馳在黑影里 我想到你居住的城 城市有窗座掘,窗邊有燈 而你是整座城唯一降...
    謊言家LXN閱讀 240評論 0 1