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