標籤:
簡介:
最近公司項目收尾,可以有時間看看書了。《編寫高品質iOS與OS X代碼的52個有效方法》這本書講解了很多iOS開發的技巧和規範,大力推薦!
下面是自己看書時整理的筆記,照慣例先上目錄:
目錄:
第一章:熟悉Objective-C
第二章:Object、Message、Runtime
第三章:介面與API設計
第四章:Protocol與Category
第五章:記憶體管理
第六章:Block與GCD
第七章:系統架構
第一章 熟悉Objective-C
第1條:瞭解Objective-C語言的起源
- 語言類型
- 訊息結構(messaging structure),對應函數調用(function calling)
- 與函數調用語言的區別
- 訊息結構:運行時所應執行的代碼由運行環境來決定
- 函數調用:運行時所應執行的代碼由編譯器決定
- 要點
- OC為C語言添加了物件導向特性,是其超集
- OC使用動態綁定訊息結構,也就是說,在運行時才會檢查物件類型。接收一條訊息之後,究竟應執行何種代碼,由運行期環境而非編譯器來決定
- 理解C語言的核心概念有助於寫好OC程式,尤其要掌握記憶體模型與指標
第2條:在類的標頭檔中盡量少引入其他標頭檔
- @class
- 將引入標頭檔的時機盡量延後,只在確有需要時才引入,這樣可以減少類的使用者所需引入的標頭檔數量(減少編譯時間)
- 要點
- 除非確有必要,否則不要引入標頭檔
- 一般來說,應在某個類的標頭檔中使用前置聲明來提及別的類,並在實現檔案中引入那些類的標頭檔,這樣做可以盡量降低類之間的耦合
- 有時無法使用前置聲明,比如要聲明某個類遵循一項協議
第3條:Literal Syntax
- literal syntax可以使NSNumber、NSArray和NSDictionary的代碼更簡潔清晰
- NSNumber
- 傳統建立方式
- NSNumber *someNumber = [NSNumber numberWithInt:1];
- literal syntax
- NSNumber *someNumber = @1;
- NSArray
- 傳統建立方式
- NSArray *animals = [NSArray arrayWithObjects:@“cat”, @“dog", nil];
- literal syntax
- NSArray *animals = @[@“cat”, @“dog”];
- NSDictionary
- 傳統建立方式
- NSDictionary *personData = [NSDictionary dictionaryWithObjectsAndKeys:@“Matt”, @“firstName”, nil];
- literal syntax
- NSDictionary *personData = @{@“Matt” : @“firstName”};
- NSMutableArray和NSMutableDictionary
- 傳統取下標修改元素值
- [mutableArray replaceObjectAtIndex:1 withObject:@“dog”];
- [mutableDictionary setObject:@“Galloway” forKey:”lastName”];
- literal syntax
- mutableArray[1] = @“dog”;
- mutableDictionary[@“lastName”] = @“Galloway”;
- 局限性
- 除了字串以外,所建立出來的對象必須屬於Foundation架構
- 如果自訂了這些類的子類,則無法用Literal Syntax建立其對象
- 要想建立自訂子類的執行個體,需採用nonliteral syntax
- 使用Literal Synatax建立出來的對象都是不可變的,如需可變版本,則需copy
- 要點
- 應該使用Literal Syntax來建立NSString、NSNumber、NSArray、NSDictionary,與建立此類對象的常規方法相比,這麼做更加簡明扼要
- 應該通過取下標操作來訪問數組下標或字典中的key所對應的元素
- 用Literal Synatax文法建立數組或字典時,若值中有nil,則會拋出異常。因此,務必確保值裡不含nli
第4條 多用類型變數,少用#define預先處理指令
- 要點
- 不要用預先處理指令定義常量
- 這樣定義出來的常量不含類型資訊,編譯器只是會在編譯前據此執行尋找與替換操作。即使有人重新定義了常量值,編譯器也不會產生警告資訊,這將導致應該用程式中的常量值不一致
在實現檔案中使用static const來定義只在編譯單元內可見的常量(translation-unit-specific constant)
- 由於此類常量不在全域符號表中,所以無需為其名稱加首碼
- 在標頭檔中使用extern來聲明全域變數,並在相關實現檔案中定義其值
- 這種常量要出現在全域符號表中,所以名稱應加以區隔,通常用與之相關的類名做首碼
第5條 用枚舉表示狀態、選項、狀態代碼
- 要點
- 應該用枚舉來表示狀態機器的狀態、傳遞給方法的選項以及狀態代碼等值,給這些值起個易懂的名字
- 如果把傳遞給某個方法的選項表示為枚舉類型,而多個選項又可同時使用,那麼就將各選項值定義為2的冪,以便通過按為或操作將其組合起來
- 用NS_ENUM與NS_OPTIONS宏來定義枚舉類型,並指定其底層資料類型
- 這樣做可以確保枚舉是用開發人員所選的底層資料類型表現出來的,而不會採用編譯器所選的類型
- 在處理枚舉類型的switch中不要事先default分支
- 這樣的話,加入新枚舉之後,編譯器就會提示開發人員:switch語句並未處理所有枚舉
[iOS筆記]《編寫高品質iOS與OS X代碼的52個有效方法》:1.熟悉Objective-C