NSCache是什么
NSCache對(duì)象是存儲(chǔ)鍵值對(duì)的可變集合,類似于NSDictionary。NSCache類提供一個(gè)編程接口用來添加和刪除對(duì)象,并根據(jù)緩存占用的大小和數(shù)量設(shè)置丟棄策略。
NSCache對(duì)象不同于其它可變集合:
- NSCache類包含多種自動(dòng)淘汰策略,來確保緩存不會(huì)占用太多的系統(tǒng)內(nèi)存。如果其它程序需要內(nèi)存,緩存策略會(huì)刪除一些緩存,最小化其內(nèi)存占用。
- NSCache是線程安全的,當(dāng)操作緩存時(shí)不用加鎖。
- 和NSMutableDictionay不同的是,NSCache不會(huì)copy的集合中的鍵對(duì)象。
NSCache通常用來存儲(chǔ)臨時(shí)數(shù)據(jù),重用這些對(duì)象能夠提供性能優(yōu)勢(shì),因?yàn)椴槐乇辉俅斡?jì)算它們的值。然而,這些對(duì)象對(duì)于應(yīng)用程序并不重要,如果內(nèi)在不足可以被丟棄。如果丟棄,在需要的時(shí)候,會(huì)再次計(jì)算它們的值。
NSCache的屬性與方法
//設(shè)置緩存占用的內(nèi)存最大值。默認(rèn)為0,內(nèi)存大小沒有限制。這并不是一個(gè)嚴(yán)格的限制,最終取決于緩存策略。
@property NSUInteger totalCostLimit;
//設(shè)置緩存可保存的對(duì)象數(shù)量。效果同上。
@property NSUInteger countLimit;
//設(shè)置是否自動(dòng)舍棄那些內(nèi)存已經(jīng)被丟棄的對(duì)象。
@property BOOL evictsObjectsWithDiscardedContent;
//獲取與指定鍵關(guān)聯(lián)的對(duì)象
- (nullable ObjectType)objectForKey:(KeyType)key;
//在緩存中設(shè)置指定鍵名對(duì)應(yīng)的值
- (void)setObject:(ObjectType)obj forKey:(KeyType)key;
//在緩存中設(shè)置指定鍵名對(duì)應(yīng)的值,并且指定該鍵值對(duì)的成本
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;
//刪除緩存中指定鍵名的對(duì)象
- (void)removeObjectForKey:(KeyType)key;
//刪除緩存中的所有對(duì)象
- (void)removeAllObjects;
NSDiscardableContent
一個(gè)NSDiscardableContent對(duì)象的生命周期取決于counter變量。一個(gè)此對(duì)象是可清除的內(nèi)存塊,并用于跟蹤其內(nèi)存是否正在被其它對(duì)象使用。當(dāng)這塊內(nèi)存正在被使用或仍被需要,此對(duì)象的counter這是會(huì)>=1。當(dāng)這塊內(nèi)存將不被使用且可以被丟棄,counter=0.
當(dāng)counter=0時(shí),如果內(nèi)存緊張,此內(nèi)存塊可能會(huì)被丟棄。調(diào)用discardContentIfPossible方法來丟棄內(nèi)容,它將會(huì)釋放counter=0的內(nèi)存。
NSDiscardableContent對(duì)象默認(rèn)初始化counter變量=1以確保它們不會(huì)被內(nèi)存管理系統(tǒng)立即丟棄。因此,必須跟蹤counter變量狀態(tài)。調(diào)用beginContentAccess方法使counter+1確保對(duì)象不被丟棄。當(dāng)不再需要此對(duì)象時(shí),調(diào)用endContentAccess方法使counter-1。 -(BOOL)isContentDiscarded方法返回此對(duì)象內(nèi)存是否已經(jīng)丟棄。