iOS緩存策略之NSCache的簡(jiǎn)單使用

image

NSCache是一個(gè)繼承NSObjec的可變集合,是蘋果提供的一套緩存機(jī)制,用鍵值(key-value)對(duì)來(lái)臨時(shí)存儲(chǔ)只需要短暫存儲(chǔ)在內(nèi)存中的數(shù)據(jù),并且當(dāng)內(nèi)存空間很少的時(shí)候會(huì)可以自動(dòng)釋放一些資源。

概觀

緩存(cache)對(duì)象和其他可變集合不同的幾個(gè)方面妖滔。

  • NSCache類包含了各種自動(dòng)銷毀策略,來(lái)保證緩存內(nèi)容沒(méi)有占用過(guò)多的系統(tǒng)內(nèi)存桶良。如果其他應(yīng)用需要內(nèi)存铛楣,這些策略會(huì)從系統(tǒng)中移除一些選項(xiàng)內(nèi)容,來(lái)減少當(dāng)前app占用的內(nèi)存空間艺普。
  • 可以在不同的線程中對(duì)內(nèi)存中的緩存執(zhí)行添加簸州、移除和查詢操作,而不必自己鎖住緩存,因?yàn)槭蔷€程安全的歧譬。
  • 不同于NSMutableDictionary對(duì)象岸浑,緩存使用的key是不需要是實(shí)現(xiàn)NSCopying協(xié)議的,NSMutableDictionary是非線程安全的瑰步,在OC中可變類型一般都是非線程安全的矢洲。
  • NSCache可以指定緩存數(shù)量(限額)和一共可用的空間容量,當(dāng)緩存超出限額或者可用內(nèi)存容量會(huì)自動(dòng)釋放相應(yīng)內(nèi)存缩焦。

通常使用NSCache對(duì)象去臨時(shí)存儲(chǔ)那些創(chuàng)建很昂貴的過(guò)渡數(shù)據(jù)读虏。重用這些數(shù)據(jù)可以提供性能優(yōu)勢(shì)责静,因?yàn)檫@些值沒(méi)必要被重新計(jì)算。有些數(shù)據(jù)并非是關(guān)鍵數(shù)據(jù)盖桥,在內(nèi)存緊張的時(shí)候灾螃,可以被丟棄。如果丟棄揩徊,這些值將會(huì)被重新計(jì)算腰鬼。

具有子組件的對(duì)象在沒(méi)有被使用時(shí)可以被丟棄,該對(duì)象可以采用NSDiscardableContent協(xié)議塑荒,去提高緩存回收行為熄赡。默認(rèn)情況下。在緩存中的NSDiscardableContent對(duì)象丟棄的內(nèi)容會(huì)被自動(dòng)移出緩存齿税,即使這個(gè)自動(dòng)移除政策是可以修改的彼硫。如果一個(gè)NSDiscardableContent對(duì)象被放進(jìn)緩存中,那么當(dāng)該對(duì)象被移出時(shí)會(huì)調(diào)用discardContentIfPossible凌箕。

使用

以下可以使用拧篮,從多個(gè)方法介紹NSCache。


image
// 緩存的名稱
@property (copy) NSString *name;

設(shè)置緩存空間

// 對(duì)象緩存可持有最大的數(shù)量 陌知,默認(rèn)是0 沒(méi)有限制)他托,一旦超出限額掖肋,會(huì)自動(dòng)刪除之前添加的緩存數(shù)據(jù)
@property NSUInteger countLimit;
// 緩存中可持有的最大空間 默認(rèn)是0(沒(méi)有限制)
@property NSUInteger totalCostLimit;

管理丟棄內(nèi)容

// 是否可以自動(dòng)緩存清除可丟棄的內(nèi)容仆葡,默認(rèn)是YES
@property BOOL evictsObjectsWithDiscardedContent;
// 可以實(shí)現(xiàn)這個(gè)協(xié)議,當(dāng)類的對(duì)象有可以被銷毀不再使用的子組件志笼。這樣使用app占用更少的內(nèi)存空間沿盅。
NSDiscardableContent

設(shè)置代理

// cache的代理
@property (nullable, assign) id<NSCacheDelegate> delegate;
// 一個(gè)NSCache對(duì)象的代理,實(shí)現(xiàn)這些協(xié)議代理纫溃,去將對(duì)象從緩存中移除
NSCacheDelegate

獲取一個(gè)緩存值

// 返回給定key關(guān)聯(lián)的value值
- (nullable ObjectType)objectForKey:(KeyType)key;

添加和移除緩存值

// 根據(jù)key值設(shè)置在緩存中的value值
- (void)setObject:(ObjectType)obj forKey:(KeyType)key; // 0 cost
// 根據(jù)key值設(shè)置在緩存中的value值腰涧,并且指定關(guān)聯(lián)key-value對(duì)的成本
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;
// 根據(jù)key值移除在緩存的value值
- (void)removeObjectForKey:(KeyType)key;
// 清空全部緩存,調(diào)用次方法依然可以添加新值紊浩,網(wǎng)上很多復(fù)制粘貼的博客窖铡,都說(shuō)調(diào)用次方法后不能添加,親測(cè)是可以的坊谁。
- (void)removeAllObjects;

NSCacheDelegate 方法

@protocol NSCacheDelegate <NSObject>
@optional
// 回收內(nèi)存空間使用费彼。
// cache 緩存對(duì)象。
// obj 被回收的對(duì)象口芍。
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;
@end

在NSObject.h中的可以廢棄內(nèi)容箍铲。

/***********    Discardable Content     ***********/

@protocol NSDiscardableContent
@required
- (BOOL)beginContentAccess;
- (void)endContentAccess;
- (void)discardContentIfPossible;
- (BOOL)isContentDiscarded;
@end

@interface NSObject (NSDiscardableContentProxy)
@property (readonly, retain) id autoContentAccessingProxy;
@end

使用

  1. 初始化對(duì)象
// 1. 初始化數(shù)據(jù)
- (NSCache *)mainCache{
    if (!_mainCache) {
        _mainCache = [[NSCache alloc] init];
        _mainCache.countLimit = 300; // 限制個(gè)數(shù),默認(rèn)是0鬓椭,無(wú)限空間
        _mainCache.totalCostLimit = 5*1024*1024; // 設(shè)置大小設(shè)置颠猴,默認(rèn)是0关划,無(wú)限空間
        _mainCache.name = @"cache1";
        _mainCache.delegate = self;
    }
    return _mainCache;
}
  1. 添加緩存
// 添加緩存
 [self.mainCache setObject:data forKey:str];
  1. 移除。在內(nèi)存警告的時(shí)候(didReceiveMemoryWarning)移除緩存翘瓮。給對(duì)象發(fā)送removeAllObjects贮折,后添加緩存setObject:forKey:是可以的,可以再添加進(jìn)去的春畔。還有一個(gè)根據(jù)key移除對(duì)應(yīng)的值脱货。
[self.mainCache removeAllObjects];
//[self.mainCache removeObjectForKey:@"XXX"];
  1. 代理
    在當(dāng)前對(duì)象遵守NSCacheDelegate協(xié)議。并且實(shí)現(xiàn)協(xié)議律姨。并且讓當(dāng)前對(duì)象成為代理_mainCache.delegate = self;
- (void)cache:(NSCache *)cache willEvictObject:(id)obj{
    NSLog(@"%s",__func__);
}

推薦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末振峻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子择份,更是在濱河造成了極大的恐慌扣孟,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荣赶,死亡現(xiàn)場(chǎng)離奇詭異凤价,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拔创,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門利诺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人剩燥,你說(shuō)我怎么就攤上這事慢逾。” “怎么了灭红?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵侣滩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我变擒,道長(zhǎng)君珠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任娇斑,我火速辦了婚禮策添,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毫缆。我一直安慰自己唯竹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布悔醋。 她就那樣靜靜地躺著摩窃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猾愿,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天鹦聪,我揣著相機(jī)與錄音,去河邊找鬼蒂秘。 笑死泽本,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姻僧。 我是一名探鬼主播规丽,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撇贺!你這毒婦竟也來(lái)了赌莺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤松嘶,失蹤者是張志新(化名)和其女友劉穎艘狭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翠订,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巢音,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尽超。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官撼。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖似谁,靈堂內(nèi)的尸體忽然破棺而出傲绣,到底是詐尸還是另有隱情,我是刑警寧澤棘脐,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布斜筐,位于F島的核電站龙致,受9級(jí)特大地震影響蛀缝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜目代,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一屈梁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧榛了,春花似錦在讶、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春曙强,著一層夾襖步出監(jiān)牢的瞬間残拐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工碟嘴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溪食,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓娜扇,卻偏偏與公主長(zhǎng)得像错沃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雀瓢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361