Effective Objective-C 2.0讀書筆記(七)

系統(tǒng)框架

系統(tǒng)框架很強(qiáng)大,不過里面也許會(huì)有不合時(shí)宜而且用起來很蹩腳的地方,但也會(huì)有遺失的珍寶藏于其間。

47.熟悉系統(tǒng)框架

許多系統(tǒng)框架都可以直接使用。其中最重要的是Foundation與CoreFoundation,這兩個(gè)框架提供了構(gòu)建應(yīng)用程序所需的許多核心功能。

很多常見任務(wù)都能用框架來做,例如音頻與視頻處理、網(wǎng)絡(luò)通信、數(shù)據(jù)管理等。

48.多用塊枚舉,少用for循環(huán)

遍歷collection有四種方式。最基本的辦法是for循環(huán),其次是NSEnumeration遍歷法及快速遍歷法,最新、最先進(jìn)的方式則是“塊枚舉法”。

“塊枚舉法”本身就能通過GCD來并發(fā)執(zhí)行遍歷操作,無須另行編寫代碼。而采用其他遍歷方式則無法輕易實(shí)現(xiàn)這一點(diǎn)。

若提前知道待遍歷的collection含有何種對象,則應(yīng)修改塊簽名,指出對象的具體類型。

49.對自定義其內(nèi)存管理語義的collection使用無縫橋接

在CoreFoundation層面創(chuàng)建collection時(shí),可以指定許多回調(diào)函數(shù),這些函數(shù)表示此collection應(yīng)如何處理其元素。然后,可運(yùn)用無縫橋接技術(shù),將其轉(zhuǎn)換成具備特殊內(nèi)存管理語義的Objective-C collection。

50.構(gòu)建緩存時(shí)選用NSCache而非NSDictionary

實(shí)現(xiàn)緩存時(shí)應(yīng)選用NSCache而非NSDictionary對象。因?yàn)镹SCache可以提供優(yōu)雅的自動(dòng)刪減功能,而且是“線程安全的”,此外,它與字典不同,并不會(huì)拷貝鍵。

可以給NSCache對象設(shè)置上限,用以限制緩存中的對象總個(gè)數(shù)及“總成本”,而這些尺度則定義了緩存刪減其中對象的時(shí)機(jī)。但是絕對不要把這些尺度當(dāng)成可靠的“硬限制”(hard limit),它們僅對NSCache起指導(dǎo)作用。

將NSPurgeableData與NSCache搭配使用,可實(shí)現(xiàn)自動(dòng)清除數(shù)據(jù)的功能,也就是說,當(dāng)NSPurgeableData對象所占內(nèi)存為系統(tǒng)所丟棄時(shí),該對象自身也會(huì)從緩存中移除。

如果緩存使用得當(dāng),那么應(yīng)用程序的響應(yīng)速度就能提高。只有那種“重新計(jì)算起來很費(fèi)事的”數(shù)據(jù),才值得放入緩存,比如那些需要從網(wǎng)絡(luò)獲取或從磁盤讀取的數(shù)據(jù)。

51.精簡initialize與load的實(shí)現(xiàn)代碼

在加載階段,如果類實(shí)現(xiàn)了load方法,那么系統(tǒng)就會(huì)調(diào)用它。分類里也可以定義此方法,類的load方法要比分類中的先調(diào)用。與其他方法不同,load方法不參與覆寫機(jī)制。

首次使用某個(gè)類之前,系統(tǒng)會(huì)向其發(fā)送initialize消息。由于此方法遵從普通的覆寫規(guī)則,所以通常應(yīng)該在里面判斷當(dāng)前要初始化的是哪個(gè)類。

load與initialize方法都應(yīng)該實(shí)現(xiàn)得精簡一些,這有助于保持應(yīng)用程序的響應(yīng)能力,也能減少引入“依賴環(huán)”(interdependency cycle)的幾率。

無法在編譯期設(shè)定的全局常量,可以放在initialize方法里初始化。

52.別忘了NSTimer會(huì)保留其目標(biāo)對象

NSTimer對象會(huì)保留其目標(biāo),直到計(jì)時(shí)器本身失效為止,調(diào)用invalidate方法可令計(jì)時(shí)器失效,另外,一次性的計(jì)時(shí)器在觸發(fā)完任務(wù)之后也會(huì)失效。

反復(fù)執(zhí)行任務(wù)的計(jì)時(shí)器(repeating timer),很容易引入保留環(huán),如果這種計(jì)時(shí)器的目標(biāo)對象又保留了計(jì)時(shí)器本身,那么肯定會(huì)導(dǎo)致保留環(huán)。這種環(huán)狀保留關(guān)系,可能是直接發(fā)生的,也可能是通過對象圖里的其他對象間接發(fā)生的。

可以擴(kuò)充NSTimer的功能,用“塊”來打破保留環(huán)。不過,除非NSTimer將來在公共接口里提供此功能,否則必須創(chuàng)建分類,將相關(guān)實(shí)現(xiàn)代碼加入其中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容