第1條:Object C的起源
Object C是訊息結構的語言,執行時所應執行的程式碼由執行時環境決定的。在執行時才會去查詢要執行的方法,並不是由編譯的時候決定的。其實現原理是由執行期元件完成(runtime component),使用Objective C的物件導向特性所需的全部資料結構以及函式都在執行期元件裡面。執行期元件本質上是一種與開發者所編寫的程式碼相連結的動態庫(dynamic library),其程式碼能把開發者所編寫的所有程式粘合起來,所以只要更新執行期元件,就可以提升應用程式效能 。
Object C的物件分配到堆,物件的指標分配到棧中(32位的系統佔4個位元組,64位系統佔8個位元組)。分配到都堆中的記憶體必須直接管理,分配到棧中用於儲存變數的記憶體則會在其棧幀彈出時自動清理。
有時會遇到定義裡不含*的變數,它們可能會使用『棧空間』,例如CGRect C的結構體。
第2條:類的標頭檔案中儘量少引入其它的標頭檔案
如果類的標頭檔案中要宣告其它類的屬性,如只需要其型別不需要知道該類的全部實現細節,則只要使用『向前宣告』即可,例如在類的標頭檔案中引入 @class SomeClass,這樣可以減少編譯的時間。但如果類的實現檔案.m中要使用後者的時候,則需要引入該類的標頭檔案使用#import。
protocol儘量放單獨的標頭檔案中,如放到某類的標頭檔案中,如其它類要遵循此協議則需引入類的全部內容,產生相互依賴,增加編譯時間。
第3條:多用字面量語法,少用與之等價的語法
//no
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"kitty",@"name",@"1353**94618",@"number", nil];
NSString *str = [[NSString alloc] initWithString:@"hello kitty"];
//yes
NSNumber *intNumber = @10 ;
NSString *someString = @"hello";
NSArray *someArray =@[@"1",@"2"];
NSDictionary *someDictionary = @{@"one" : @"1",
@"two" : @"2"};
複製程式碼
字面量簡潔,易讀
字面量也有不足的地方,它不能表達可變型別,但可以直接在不可變物件使用copy方法,如下:
NSMutableDictionary *someMutableDictionary = [@{@"one" : @"1",
@"two" : @"2"} mutableCopy];
複製程式碼
第4條:多用型別常量,少用#define預處理指令
使用預處理指令如下:
#define ANIMATION_DURATION 0.3
複製程式碼
預處理指令的處理方式是,在引用它的地方將所有跟ANIMATION_DURATION一樣的字串都替換為0.3,所以不太推薦此種做法。用宣告常量的方式來替代巨集,明顯更為妥當。
//宣告一個NSTimeInterval的常量
/*
static標明在此編譯單元可見(.m檔案內),如果不宣告,編譯器會為它建立一個『外部符號』,如在別的編譯單元內有宣告同樣名稱的變數,會編譯報錯;const宣告變數值不可被修改。
*/
static const NSTimeInterval KAnimitionDuration = 0.3;
複製程式碼
第5條:用列舉表示狀態、選項、狀態碼
//表示網路狀態的狀態列舉
typedef NS_ENUM(NSInteger,NCNetworkStatus) {
NCNetworkStatusConnected, //預設為0,除非指定值
NCNetworkStatusConnecting,
NCNetworkStatusdisConnected
};
//
NCNetworkStatus status = NCNetworkStatusdisConnected;
switch (status) {
case NCNetworkStatusConnected:
{
}
break;
case NCNetworkStatusConnecting:
{
}
break;
case NCNetworkStatusdisConnected:
{
}
break;
default: //這裡不要增加選項,否則當我們在列舉增加選項時而沒實現是有編譯提示的,以防我們遺忘新增選項相關的邏輯處理
break;
}
//選項的列舉,可使用位操作來表示選項組合
typedef NS_OPTIONS(NSUInteger, NCDirection) {
NCDirectionNone = 0,
NCDirectionUp = 1 << 0,
NCDirectionDown = 1 << 1,
NCDirectionLeft = 1 << 2,
NCDirectionRight = 1 << 3
};
NCDirection direction = NCDirectionUp | NCDirectionLeft; //值為5,就可以判斷為是上與左的組合選項了
複製程式碼