實(shí)現(xiàn)緩存:?
NSCache相比NSDictonary:
1)多數(shù)情況下,可以使用objectForKey: ?/ setObject: forKey: /removeObjectForKey:
2)擁有多線程安全的特性,可以在任何線程上不加鎖地修改NSCache;
3)還被設(shè)計為能與符合<NSDiscardableContent>協(xié)議的對象整合,開發(fā)者可以通過調(diào)用 beginContentAccess 和 endContentAccess 控制何時丟棄對象是安全的
4)能在應(yīng)用運(yùn)行時/應(yīng)用暫停時 提供自動緩存管理;也會在使用<NSdiscardableContent>的常見類型NSurgreableData后, iOS會釋放內(nèi)存(即使應(yīng)用處于暫停狀態(tài))。
----------------------------------------分割線------------------------------------------
圖層繪制:(CALayer和UIView)
UIView是一個相當(dāng)重量級的對象,它管理繪制與事件處理(尤其是觸摸事件)。CALayer完全關(guān)乎繪制。事實(shí)上,UIView依靠CALayer來管理繪制,這樣兩者就能協(xié)作的很好。圖層會在它的contents屬性中繪制任意東西,開發(fā)者負(fù)責(zé)進(jìn)行設(shè)置。
方法一:直接分配
UIImage *image = ...;
CALayer *layer = ...;
layer.contents = (id)image.CGImage;
方法二:core Animation會按照以下順序通過CALayer和委托方法來創(chuàng)建它。
1)[CALayer setNeedsDisplay] : 代碼需要調(diào)用它。它會將圖層標(biāo)記為需要重繪的,要求通過列表中的步驟來更新contents。除非調(diào)用了setNeedsDisplay方法,房子contents屬性永遠(yuǎn)不會更新。
2)[CALayer displayIfNeeded] :繪制系統(tǒng)會在需要時自動調(diào)用它。如果圖層通過被調(diào)用setNeedsDisplay標(biāo)記為需要重繪的,繪制系統(tǒng)就會接著執(zhí)行后續(xù)步驟。
3)[CALayer display]:? displayIfNeeded方法會在合適的時候調(diào)用它。開發(fā)者不應(yīng)該直接調(diào)用它,如果實(shí)現(xiàn)了委托方法,默認(rèn)實(shí)現(xiàn)會調(diào)用displayeLayer: 委托方法。否則,display方法會調(diào)用drawInContext:方法。可以在子類中覆蓋display方法以直接設(shè)置contents屬性
4)[delegate displayLayer: ] :默認(rèn)的[CALayer display]會在方法實(shí)現(xiàn)這個方法時調(diào)用它。它的任務(wù)是設(shè)置contents。如果實(shí)現(xiàn)了這個方法(即使沒有什么操作),后面就不會運(yùn)行自定義的繪制代碼。
5)[CALayer drawInContext:] :默認(rèn)的display方法會創(chuàng)建一個視圖圖形上下文并將其傳給drawInContext: 方法。它與UIView drawRect:方法相似,但不會自動設(shè)置UIKit上下文。為了使用UIKit來繪圖,你需要調(diào)用UIGraphicsPushContext()方法指定接收到的上下文為當(dāng)前上下文。否則,他只會使用Core Graphics在接收到的上下文中繪圖。默認(rèn)的display 方法獲取最終的上下文,創(chuàng)建一個CGImage并將其分配給contents。默認(rèn)的CALayer drawInContext:] 會在方法已實(shí)現(xiàn)時調(diào)用【delegate drawLayer: inContext】。否則,就不執(zhí)行任何操作。不過可以直接調(diào)用這個方法
6)[delegate drawLayer: inContext:]: 如果實(shí)現(xiàn)了這個方法,默認(rèn)的drawInContext:會調(diào)用這個方法實(shí)現(xiàn)更新上下文,從而是display方法可以創(chuàng)建CGImage。
總結(jié):使用drawInContext:方法是設(shè)置contents的另一種方法。它是通過display方法調(diào)用的,而display 方法只有當(dāng)你通過 setNeedsDisplay 方法明確標(biāo)記圖層為需要重繪是調(diào)用。
drawInContext:只在當(dāng)前圖層繪制(不包括期任何子圖層)。要繪制圖層及其子圖層,可以使用renderInContext:方法,它可以捕捉圖層當(dāng)前動畫的狀態(tài)。renderInContext:使用當(dāng)前渲染的狀態(tài)(由Core Animation內(nèi)部管理),因此它不會調(diào)用drawInContext:方法。