52個(gè)有效方法閱讀筆記(六)

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

  • 將一系列代碼封裝成動(dòng)態(tài)庫(kù)(dynamic library),并在其中放入描述其接口的頭文件,這樣做出來的東西就叫框架.

  • 系統(tǒng)的一些常見框架:

  • CFNetwork 此框架提供了 C 語言級(jí)別的網(wǎng)絡(luò)請(qǐng)求,它將"BSD 套接字"(BSD socket)抽象成易于使用的網(wǎng)絡(luò)接口.

  • CoreAudio 該框架所提供的 C 語言 API 可用來操作設(shè)備上的音頻硬件.

  • AVFoundation 此框架所提供的 Objective-C 對(duì)象可用來回放并錄制音頻及視頻,比如能夠在 UI 視圖類里播放視屏.

  • CoreData 此框架所提供的 Objective-C 接口可以將對(duì)象放入數(shù)據(jù)庫(kù),便于持久化保存.

  • CoreText 此框架提供的 C 語言接口可以高效執(zhí)行文字排版及渲染操作.

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

  • 請(qǐng)記住:用純 C 寫成的框架與用 Obecjtive-C 寫成的一樣重要,若想成為優(yōu)秀的 Objective-C 開發(fā)者,應(yīng)該掌握 C 語言的核心概念.

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

  • for 循環(huán),這是最基本的循環(huán)方法,因而功能也非常有限.
  • 使用 Objective-C1.0的 NSEnumerator 來遍歷: NSEnumerator是個(gè)抽象類,提供了兩個(gè)方法
- (NSArray *)allObejcts
- (id)nextObject
  • 快速遍歷, for in :如果某個(gè)類的對(duì)象支持快速遍歷,那么就可以宣城自己遵從了名為 NSFastEnumerator 的協(xié)議,從而開發(fā)者可以采用次語法來迭代該對(duì)象.此協(xié)之定義了一個(gè)方法:
- (NSUInteger)countByEnumeratingWithState:
               (NSFastEnumerationSate *)state
               object:(id *)stackbuffer
                count:(NSUInteger)length
  • 基于塊的遍歷方式:此方法大大勝于其他方式的地方在于:遍歷時(shí)可以直接獲取更多信息.
  • 遍歷 collection 有四種方法.最基本的辦法就是 for 循環(huán),其次是NSEnumerator 遍歷法及快速遍歷法,最新,最先進(jìn)的方式是"塊枚舉法".
  • "塊枚舉法"本身就能通過 GCD 來并發(fā)執(zhí)行遍歷操作,無需另行編寫代碼.而采用其他遍歷方法則無法輕易實(shí)現(xiàn)這一點(diǎn).
  • 若提前知道呆遍歷的 collection 含有的何種對(duì)象,則應(yīng)該改塊簽名,指出對(duì)象的具體類型.這樣編譯器就可以檢測(cè)出開發(fā)者是否調(diào)用了該對(duì)象不具備的方法,并在發(fā)現(xiàn)這種問題時(shí)報(bào)錯(cuò).

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

  • 使用"無縫橋接(toll-free-bridging)"技術(shù),可以在定義與 Foundation 框架中的 Obejctive-C 類和定義 CoreFoundation 框架中的 C 數(shù)據(jù)結(jié)構(gòu)之間互相轉(zhuǎn)換.
  • __brige 本身的意思是: ARC 仍然具備這個(gè) Obejctive-C 對(duì)象的所有權(quán),而 __bridge retained 則相反,意味著 ARC 將交出對(duì)象的所有權(quán).
  • 在 CoreFoundation 層面創(chuàng)建 collection 時(shí),可以指定許多回調(diào)函數(shù),這些函數(shù)表示此 collection 應(yīng)如何處理其元素.然后,可運(yùn)用無縫橋接技術(shù),將其轉(zhuǎn)換成具備特殊內(nèi)存管理語義的 Objective-C collection.

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

  • NSCache 勝過 NSDictionary 之處于,當(dāng)系統(tǒng)資源將要耗盡時(shí),它可以自動(dòng)刪減緩存. NSCache 會(huì)先行刪減"最久未使用的(lease recently used)"對(duì)像.
  • 實(shí)現(xiàn)緩存時(shí)應(yīng)選用 NSCache 而并非 NSDicationary 對(duì)象,因?yàn)?NSCache 可以提供優(yōu)雅的,自動(dòng)刪減功能,而且是"線程安全的",此外,它與字典不同,并不會(huì)拷貝鍵.
  • 可以給 NSCache 對(duì)象設(shè)置上限,用以限制緩存中的對(duì)象總個(gè)數(shù)及"總成本",而這些尺度則定義了緩存刪減其中對(duì)象的時(shí)機(jī).但是絕對(duì)不要把這些尺度當(dāng)成可靠的"硬限制(hard limit)",它們僅對(duì) NSCache 起指導(dǎo)作用.
  • 如果緩存使用得當(dāng),那么應(yīng)用程序的響應(yīng)速度就能提高.只有那種狗"重新計(jì)算起來費(fèi)事"數(shù)據(jù),才值得放入緩存,比如那些需要從網(wǎng)絡(luò)獲取或從磁盤讀取的數(shù)據(jù).

5.精簡(jiǎn) initialize 與 load 的實(shí)現(xiàn)方法

    • (void)load 對(duì)于加運(yùn)行系統(tǒng)的每個(gè)類(class)和分類(catergory)來說,必定會(huì)調(diào)用此方法,而且僅調(diào)用一次.
  • initialize 方法只應(yīng)該用來設(shè)內(nèi)部數(shù)據(jù),不應(yīng)該在其中調(diào)用其他方法,即便是本類方法,也最好不要調(diào)用.
  • 在加載階段,如果實(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)得精簡(jiǎn)一些,這有助于應(yīng)用程序的響應(yīng)能力,也能減少引入"依賴環(huán)(interdependency cycle)"的幾率.
  • 無法在編譯期設(shè)定的全局變量,可以放在 initialize 方法里面設(shè)置.

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

  • 計(jì)時(shí)器要和"運(yùn)行循環(huán)(run loop)"相關(guān)聯(lián),運(yùn)行循環(huán)到時(shí)候回觸發(fā)任務(wù).創(chuàng)建NSTimer 時(shí),可以將其"預(yù)先安排"在當(dāng)前的運(yùn)行循環(huán)中,也可以先創(chuàng)建好,然后由開發(fā)者自己來調(diào)度.
  • NSTimer對(duì)象會(huì)保留其目標(biāo)對(duì)象,直到計(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)對(duì)象又保留了計(jì)時(shí)器本身,那肯定會(huì)導(dǎo)致保留環(huán).真陽環(huán)狀保留關(guān)系,可能是直接發(fā)生的,也可能是通過對(duì)象圖里的其它對(duì)象間接發(fā)生的.
  • 可以擴(kuò)充 NSTimer 的功能,用"塊"來打破保留環(huán).不過,除非 NSTimer 將來在公共接口里提供此功能,否則必須創(chuàng)建分類,將相關(guān)實(shí)現(xiàn)代碼加入其中.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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