?? Objective-C ?【NSCache】

GitHub Demo: https://github.com/BaHui/NSCache

簡述

  1. 官方提供的緩存類造虎,用法與NSMutableDictionary的用法很相似,使用它來管理緩存贬派。
  2. 在系統內存很低時澎媒,會自動釋放一些對象;
  3. NSCache是線程安全的。
  4. NSCache的key只是做強引用戒努,不需要實現NSCopying協議。

官方接口

// 屬性
@property NSUInteger totalCostLimit;   // 設置緩存數量
@property NSUInteger countLimit;     // 設置最大花費量
@property BOOL evictsObjectsWithDiscardedContent;` // 是否移除不再被使用的對象

// 方法
- (nullable ObjectType)objectForKey:(KeyType)key;
- (void)setObject:(ObjectType)obj forKey:(KeyType)key; // 0 cost
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;
- (void)removeObjectForKey:(KeyType)key;
- (void)removeAllObjects;

// 協議
@protocol NSCacheDelegate <NSObject>
@optional
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;

@end

屬性設置

情景一: 僅設置緩存數量: countLimit, 可用setObject: forKey:加入對象
/** `countLimit` 設置緩存數量
 *  `setObject: forKey:`
 * 當數量超出時, 默認會先移除最先添加的對象
 */
- (void)useCacheForOnlyCountLimit {
    self.cache = [[NSCache alloc] init];
    self.cache.countLimit = 5; // 設置緩存數量 <<
    self.cache.delegate = self; // 設置代理對象
    
    // 模擬存儲數據
    for (NSInteger i = 1; i <= 8; i++) {
      [self.cache setObject:@(i) forKey:@(i)];
    }
}

- (void)cache:(NSCache *)cache willEvictObject:(id)obj {
    NSLog(@"willEvictObject: %@", obj); //   輸出: 1 2 3
}
情景二: 僅設置最大花費量 totalCostLimit , 可以setObject: forKey: cost:加入對象
/** `totalCostLimit` 設置最大花費量
 *  `setObject: forKey: cost:`
 * 當總花費量超出最大花費量, 默認會先移除最先添加的對象
 */
- (void)useCacheForOnlyTotalCostLimit {
    self.cache = [[NSCache alloc] init];
    self.cache.totalCostLimit = 10; // 設置緩存容量 <<
    self.cache.delegate = self; // 設置代理對象
    
    // 模擬存儲數據
    for (NSInteger i = 1; i <= 8; i++) {
       [self.cache setObject:@(i) forKey:@(i) cost:5];
    }
}

- (void)cache:(NSCache *)cache willEvictObject:(id)obj {
    NSLog(@"willEvictObject: %@", obj); // 1 2 3 4 5 6
}
情景三: 設置 緩存數量&最大花費量 countLimit & totalCostLimit , 可用setObject: forKey: & setObject: forKey: cost:加入對象
/** `countLimit & totalCostLimit` 設置 緩存數量&最大花費量
 *  `setObject: forKey:` & `setObject: forKey: cost:`
 * 當緩存數量大于最大緩存數量 或者 總花費量超出最大花費量, 默認會先移除最先添加的對象
 */
- (void)useCacheForCountAndTotalCostLimit {
    self.cache = [[NSCache alloc] init];
    self.cache.countLimit = 5; // 設置緩存數量 <<
    self.cache.totalCostLimit = 20; // 設置緩存容量 <<
    self.cache.delegate = self; // 設置代理對象
    
    // 模擬存儲數據
    for (NSInteger i = 1; i <= 8; i++) {
        [self.cache setObject:@(i+100) forKey:@(i+100)];
        [self.cache setObject:@(i) forKey:@(i) cost:1];
    }
}

- (void)cache:(NSCache *)cache willEvictObject:(id)obj {
    NSLog(@"willEvictObject: %@", obj);
          // 101 1 102 2 103 3 104 4 105 5 106
}

交流與建議

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末撒穷,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子端礼,更是在濱河造成了極大的恐慌,老刑警劉巖佳镜,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟀伸,死亡現場離奇詭異,居然都是意外死亡啊掏,警方通過查閱死者的電腦和手機衰猛,發(fā)現死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事微姊。” “怎么了兢交?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵配喳,是天一觀的道長凳干。 經常有香客問我,道長救赐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任泌绣,我火速辦了婚禮预厌,結果婚禮上,老公的妹妹穿的比我還像新娘轧叽。我一直安慰自己,他們只是感情好崎页,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布腰埂。 她就那樣靜靜地躺著,像睡著了一般牺荠。 火紅的嫁衣襯著肌膚如雪驴一。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天杈曲,我揣著相機與錄音,去河邊找鬼担扑。 笑死,一個胖子當著我的面吹牛涌献,可吹牛的內容都是我干的。 我是一名探鬼主播燕垃,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卜壕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了印叁?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤昨悼,失蹤者是張志新(化名)和其女友劉穎跃洛,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體汇竭,經...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年两曼,在試婚紗的時候發(fā)現自己被綠了玻驻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡户辫,死狀恐怖嗤锉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情奥额,我是刑警寧澤苫幢,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布态坦,位于F島的核電站棒拂,受9級特大地震影響帚屉,放射性物質發(fā)生泄漏。R本人自食惡果不足惜漾峡,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一生逸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烙无,春花似錦、人聲如沸截酷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽三幻。三九已至呐能,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間催跪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工荣倾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留骑丸,地道東北人妒貌。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓铸豁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親在刺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,101評論 1 32
  • 今天研究SDWebimage發(fā)現,里面使用了NSCache的一個方法setObject:forKey:cost:首...
    RealSlimAlan閱讀 2,358評論 1 6
  • 從 YYCache 源碼 Get 到如何設計一個優(yōu)秀的緩存 來源:Lision 前言 iOS 開發(fā)中總會用到各種緩...
    今天lgw閱讀 6,025評論 1 22
  • NSCache 是內存緩存相艇,可以暫時儲存到內存,當程序退出時儲存的內容就會消失
    CaptainRoy閱讀 376評論 0 0
  • 20180505親愛的自己留储,今天忙得跟陀螺似的咙轩,早上五點就接到姐姐打來電話告訴我,九十五歲高齡的姑姑去世了臭墨,天堂里...
    簡單的幸福_ceb3閱讀 179評論 0 2