1.了解Objective-c 語(yǔ)言的起源
Objective-c與C++、Java等面向?qū)ο笳Z(yǔ)言類(lèi)似芹壕,不過(guò)很多方面有所差別。
Objective-c | Java等其他對(duì)象語(yǔ)言 | |
---|---|---|
消息結(jié)構(gòu) | 函數(shù)調(diào)用 | |
其運(yùn)行時(shí)所應(yīng)執(zhí)行的代碼由 | 運(yùn)行環(huán)境來(lái)決定 | 編譯器決定 |
- Objective-c為C語(yǔ)言添加了面向?qū)ο筇匦阅埽瞧涑虻bjective-c使用動(dòng)態(tài)綁定的消息結(jié)構(gòu),也就是說(shuō)屯阀,在運(yùn)行時(shí)才會(huì)檢查對(duì)象類(lèi)型缅帘。接收一條消息后,究竟應(yīng)執(zhí)行何種代碼难衰,由運(yùn)行環(huán)境而非編輯器決定钦无。
- 理解C語(yǔ)言的內(nèi)存模型和指針有利于學(xué)號(hào)Objective-c
2.在類(lèi)的頭文件中盡量少的引用其他頭文件
將引入頭文件的時(shí)機(jī)盡量延后,只在確有需要時(shí)才引入盖袭,這樣就可以減少類(lèi)的使用者所徐引入的頭文件數(shù)量失暂。(盡量別在.h文件中引入其他頭文件,一方面為了減少編譯時(shí)間鳄虱,使用@class xxx弟塞,另一方面防止兩個(gè)類(lèi)互相引用)
3.多用字面量語(yǔ)法,少用與之等價(jià)的方法
字面量也叫語(yǔ)法糖拙已,好處在于縮減源代碼長(zhǎng)度决记,精簡(jiǎn),易讀倍踪。
NSNumber *someNum = [NSNumber numberWithInt:1];
NSNumber *somenum = @1;
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2", nil];
NSArray *arr0 = @[@"1",@"2"];
NSString *str = [arr objectAtIndex:1];
NSString *str0 = arr0[1];
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value0",@"key0",@"value1",@"key1", nil];
NSDictionary *dic0 = @{@"key0":@"value0",@"key1":@"value1"};
NSString *dicStr = [dic objectForKey:@"key0"];
NSString *dicStr0 = dic[@"key0"];
* 對(duì)于數(shù)組霉涨,如果值中有nil,會(huì)有以下情況
NSString *obj0 = @"0";
NSString *obj1 = nil;
NSString *obj2 = @"2";
NSArray *arr = [NSArray arrayWithObjects:obj0,obj1,obj2, nil];
那么arr數(shù)組里面只有一個(gè)元素obj0惭适,因?yàn)橛龅降诙€(gè)元素是nil笙瑟,就會(huì)停止后面的導(dǎo)入,且程序不會(huì)報(bào)錯(cuò)癞志,這就造成安全的隱患往枷。
如果用語(yǔ)法糖,面對(duì)這種情況凄杯,程序會(huì)拋出異常错洁,便于查找和解決問(wèn)題。
* 字典中也是類(lèi)似的情況
局限性:字面量語(yǔ)法有個(gè)小小的限制戒突,就是除了字符串以外屯碴,所創(chuàng)建出來(lái)的對(duì)象必須屬于Foundation框架才行。
- 應(yīng)該使用字面量語(yǔ)法來(lái)創(chuàng)建字符串膊存,數(shù)值导而,數(shù)組忱叭,字典。與常規(guī)方法相比今艺,這么做更加簡(jiǎn)明扼要韵丑。
- 應(yīng)該通過(guò)取下標(biāo)操作來(lái)訪問(wèn)數(shù)組下標(biāo)或者字典中的鍵所對(duì)應(yīng)的元素。
- 用字面量語(yǔ)法創(chuàng)建數(shù)組或者字典時(shí)虚缎,若值中有nil撵彻,則會(huì)拋出異常。因此实牡,務(wù)必確保值里不含nil陌僵。
4.多用類(lèi)型常量,少用#define預(yù)處理指令
編寫(xiě)代碼時(shí)經(jīng)常要定義常量创坞,比如定義動(dòng)畫(huà)時(shí)長(zhǎng)常量
#define ANIMATION_DURATION 0.5
這種方法是可以實(shí)現(xiàn)想要的效果拾弃,但是這樣定義沒(méi)有類(lèi)型信息,不易被之后的閱讀者理解摆霉,
static const NSTimeInterval kAnicationDuration 0.5
用此方法定義的常量包含類(lèi)型信息,其好處是清楚的描述了常量的含義奔坟。如果有許多常量携栋,此種寫(xiě)法能令閱讀代碼的人更易理解其意圖。
常量的命名法:若常量局限于某個(gè)類(lèi)里面咳秉,則在前面加字母k婉支;若常量在類(lèi)之外可見(jiàn),則通常以類(lèi)名為前綴澜建。
變量一定要同時(shí)用static與const來(lái)聲明向挖。如果試圖修改const修飾符所聲明的變量,那么編譯器就會(huì)報(bào)錯(cuò)炕舵。static修飾符則意味著該變量?jī)H在此變量所在的類(lèi)中可用
如果要公開(kāi)一個(gè)常量何之,即全局常量,則這樣定義
在頭文件中聲明
extern NSString *const EOCStringConstant;
在實(shí)現(xiàn)文件中定義
NSString *const EOCStringConstant = @"value";
- 不要用預(yù)處理指令定義常量咽筋。
- 在.m文件中使用 static const 來(lái)定義只在本類(lèi)中使用的常量溶推。(不用為其加名稱前綴,加k)
- 在頭文件中使用extern來(lái)聲明全局常量奸攻,并在相關(guān)實(shí)現(xiàn)文件中定義其值蒜危。(用相關(guān)類(lèi)名做前綴)
5.用枚舉標(biāo)識(shí)狀態(tài)、選項(xiàng)睹耐、狀態(tài)碼
Objective-C基于C語(yǔ)言辐赞,所以它也可以使用枚舉類(lèi)型:enum。系統(tǒng)框架中總能看到它的身影硝训,但是開(kāi)發(fā)者卻容易忽視它响委,枚舉用的好的話新思,不僅使代碼看起來(lái)更加規(guī)范,明了晃酒,而且使得程序邏輯更加清晰易讀
typedef NS_ENUM(NSUInteger,personType) {
personTypeOne,//=0
personTypeTwo=5,//=5
personTypeThree//=6
};
手工指定某個(gè)枚舉成員所對(duì)應(yīng)的值表牢,不適用編譯器所分配的序號(hào)(默認(rèn)第一個(gè)為0,之后遞增1)
還有一種情況應(yīng)該使用枚舉類(lèi)型贝次,那就是定義選項(xiàng)的時(shí)候崔兴。如果這些選項(xiàng)可以互相組合,則更應(yīng)如此蛔翅。
typedef NS_OPTIONS(NSUInteger, personStatus) {
personStatus0 = 1 << 0,//=1 0001
personStatus1 = 1 << 1,//=2 0010
personStatus2 = 1 << 2,//=4 0100
personStatus3 = 1 << 3//=8 1000
};
personStatus personSta = personStatus0 | personStatus2;
NSLog(@"%ld",personSta);//打印結(jié)果 5
- 凡是需要以按位或操作組合的枚舉都應(yīng)使用NS_OPTIONS定義敲茄、。若是枚舉不需要互相組合山析,則應(yīng)使用NS_ENUM來(lái)定義堰燎。
我們總習(xí)慣在switch語(yǔ)句最后加上default分支,然而這是不好的笋轨。應(yīng)為當(dāng)我們?cè)诿杜e中又添加一個(gè)新的狀態(tài)時(shí)秆剪,如果有default這個(gè)分支,那么它就會(huì)處理這個(gè)新?tīng)顟B(tài)爵政。從而導(dǎo)致編譯器不發(fā)警告信息仅讽,這就容易出現(xiàn)漏洞,發(fā)生錯(cuò)誤卻不知道哪里出錯(cuò)钾挟。如果去掉這個(gè)default分支洁灵,編譯器就會(huì)發(fā)出警告信息,提示新加入的狀態(tài)并未在switch分支中處理掺出。
- 應(yīng)該用枚舉來(lái)表示狀態(tài)徽千,選項(xiàng),狀態(tài)碼汤锨。起個(gè)易懂的名字
- 如果選項(xiàng)可以互相組合双抽,則使用NS_OPTIONS
- 定義的時(shí)候自己給其賦初值,可以不使用編譯器給的默認(rèn)的值
- 最好不用default分支闲礼,起到提醒作用