1.objective-c為c語言添加了面向對象特性,濕氣超級。objective-c使用東臺綁定的消息結構,也就是說,在運行時才檢查對象類型。接收一條消息后,究竟應執行何種代碼,由運行期環境而非編譯器來決定。
2.將引入頭文件的時機盡量延后,只在確有需要時才引入,這樣就可以減少類的使用者所需引入的頭文件數量,如果在各自頭文件中引入對方的頭文件,則會導致“循環引用”,當解析其中一個頭文件的時,編譯器會發現它引用了另一個頭文件,兒那個頭文件又回頭引用第一個頭文件。使用#import而非#include指令雖然不會導致是循環,但卻意味著這兩個類有一個無法被正確編譯
3.多用字面量語法,少用與之等價的方法
字面量語法語法如下:
NSString *string = @"string"; NSNumber *number = @12;不用字面量方式創建:NSNumber *number = [NSNumber numberWithInt:12];字面量語法更為精簡,并且有很多其他好處使用字面量創建
NSArray *arr = @[@"obj1",@"obj2",@"obj3"]; NSString *obj = arr[1];不適用字面量NSArray *arr = [[NSArray alloc]initWithObjects:@"obj1",@"obj2",@"obj3", nil]; NSString *obj = [arr objectAtIndex:1];使用字面量更加簡潔,不過使用字面量語法創建數組時要注意,若數組元素對象中有nil,則會拋出異常,因為字面量語法實際上只是一種“語法糖”(syntactic sugar),其效果扥與先創建一個數組,然后把方括號內的所有對象都加到這個數組中。id obj1 = /*....*/; id obj2 = /*....*/; id obj3 = /*....*/; NSArray *arrA = [NSArray arrayWithObjects:obj1,obj2,obj3, nil]; NSArray *arrB = @[obj1,obj2,obj3];當 obj1和obj3都指向有效對象,而obj2是nil,則按字面量語法創建數組arrB時會拋出異常,arrA雖然該創建出來,但只含有obj1一個對象,原因是arrWithObjects會一次處理各個參數,知道法相nil為止,這個微妙的差別表明使用字面量語法更為安全,拋出異常使程序終止執行,這比創建好數組后才發祥元素少了要好,同理字典也是這樣字面量語法有個小小的限制,就是除了字符串以外,歲創建的對象必須屬于Foundation框架,如果自定義了這些類的子類,則無法使用字面量語法創建對象。
使用字面量語法創建的字符串,數組,字典對象都是不可變的,若想要可變版本的對象,則需要復制一份:
NSMutableArray *mutarr = [@[@"1",@"2"]mutableCopy];4.多用類型常量,少用#define預處理指令編寫代碼的時候經常要定義常量,例如,要定義一個動畫時間,也許會用這種方法來做
#define ANIMATON_DURATION 0.3
上述預處理命令會吧源代碼中的ANIMATION_DURATION替換成0.3,但是這樣定義出來的常量沒有類型信息,此外,預處理過程會把碰到的所有ANIMATION_DURATION替換成0.3,要解決此問題,應該利用編譯器的某些特性才對,比如
static const NSTimeInterval kAnimationDuration = 0.3;此處清楚地描述了敞亮的含義,由此可知改常量類型為NSTimeInterval這有助于為其編寫開發文檔,如果要定義許多常量,那么這種方式會令稍后的閱讀代碼的人更加容易理解其意圖。
還要注意常量常用命名法是:若常量局限某“編譯單元”之內,則在之前加字母k;若常量在類之外可見,則通常以類名為前綴。
定義常量位置很重要,在頭文件中申明可能互相沖突,其實就連用static const定義的常量也不應該出現在頭文件中,這樣等于申明了一個全局變量,如果不打算公開某個常量,可以在實現文件了這樣寫
static const NSTimeInterval kAnimationDuration = 0.3;變量一定要同時使用static和const來申明,如果不加static則編譯器會創建一個“外部符號”,此時如果另一個便一單元也申明同名變量,就會報錯有事會對外公開某個常量,則可以如下定義
// In the header file
extern NSTimeInterval *const EOCAnimationDuration// In the implementation fileNSTimeInterval *const EOCAnimationDuration = 0.3;
新聞熱點
疑難解答