第1條 :了解Objective-C語言的起源
Objective-C為C語言添加了面向?qū)ο筇匦裕瞧涑臃摺bjective-C使用動(dòng)態(tài)綁定的消息結(jié)構(gòu)解寝,也就是說,在運(yùn)行時(shí)才會(huì)檢查對(duì)象類型觅闽。接收一條消息之后帝雇,究竟應(yīng)執(zhí)行何種代碼,由運(yùn)行期環(huán)境而非編譯器決定蛉拙。
理解C語言的核心概念有助于寫好Objective-C程序尸闸。尤其要掌握內(nèi)存模型與指針。
指針內(nèi)存分配在棧上,實(shí)例內(nèi)存分配在堆上吮廉。
第2條 :在類的頭文件中盡量少引入其他頭文件
除非確有必要睹栖,否則不要引入頭文件。一般來說茧痕,應(yīng)在某個(gè)類的頭文件中使用向前聲明來提及別的類野来,并在實(shí)現(xiàn)文件中引入那些類的頭文件。這樣做可以降低類之間的耦合(coupling)踪旷。
有時(shí)無法使用向前聲明曼氛,比如要聲明某個(gè)類遵循一項(xiàng)協(xié)議。這種情況下令野,盡量把“該類遵循協(xié)議”的這條聲明移至“class-continuation分類”中舀患。如果不行的話,就把協(xié)議單獨(dú)放在一個(gè)頭文件中气破,然后將其引入聊浅。
第3條 :多用字面量語法,少用與之等價(jià)的方法
應(yīng)該使用字面量語法來創(chuàng)建字符串现使、數(shù)值低匙、數(shù)組、字典碳锈。與創(chuàng)建此類對(duì)象的常規(guī)方法相比顽冶,這么做更加簡(jiǎn)明扼要。
應(yīng)該通過取下標(biāo)操作來訪問數(shù)組下標(biāo)或字典中的鍵所對(duì)應(yīng)的元素售碳。
用字面量語法創(chuàng)建數(shù)組或字典時(shí)强重,若值中有nil,則會(huì)拋出異常贸人。因此间景,務(wù)必確保值中不含nil。
NSString *someString = @"Effective Objective-C 2.0";
NSNumber *someNumber = @1;
NSArray *array = @[@"cat", @"dog"]; ??
NSDictionary *dic = @{@"Matt":@"firstName", @"Leo":@"lastName"};
使用字面量語法創(chuàng)建出來的字符串艺智、數(shù)組倘要、字典對(duì)象都是不可變的(immutable)。若想要可變版本的對(duì)象力惯,則需復(fù)制一份:
NSMutableArray *mutableArray = [@[@1, @2, @3, @4, @5] ?mutableCopy];
第4條:多用類型常量碗誉,少用#define預(yù)處理指令
不要用預(yù)處理指令定義常量。這樣定義出來的常量不含類型信息父晶,編譯器只會(huì)在編譯前據(jù)此執(zhí)行查找與替換操作哮缺。即使有人重新定義了常量值,編譯器也不會(huì)產(chǎn)生警告信息甲喝,這將導(dǎo)致應(yīng)用程序中的常量值不一致尝苇。
在實(shí)現(xiàn)文件中使用static const來定義“只在編譯單元內(nèi)可見的常量”(translation-unit-specific constant)。由于此類常量不在全局符號(hào)列表中,所以無需為其名稱加前綴糠溜。例:在.m中static const NSTimeInterval kAnimationDuration = 0.3;
在頭文件中使用extern來聲明全局變量淳玩,并在相關(guān)實(shí)現(xiàn)文件中定義其值。這種常量要出現(xiàn)在全局符號(hào)表中非竿,所以其名稱應(yīng)加以區(qū)別蜕着,通常用與之相關(guān)的類名做前綴。例如:? ? ? ? ? ? ? ? ? ? ? .h中: extern NSString *const EOCLoginManagerDidNotification;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .m中:NSString *const EOCLoginManagerDidNotification = @"EOCLoginManagerDidNotification";
第5條:用枚舉表示狀態(tài)红柱、選項(xiàng)承匣、狀態(tài)碼
應(yīng)該用枚舉來表示狀態(tài)機(jī)的狀態(tài)、傳遞給方法的選項(xiàng)以及狀態(tài)碼等值锤悄,給這些值起個(gè)易懂的名字韧骗。
如果把傳遞給某個(gè)方法的選項(xiàng)表示為枚舉類型,而多個(gè)選項(xiàng)又可同時(shí)使用零聚,那么就將個(gè)選項(xiàng)值定義為2的冪袍暴,以便通過按位或操作將其組合起來。
用NS_ENUM與NS_OPTIONS宏來定義枚舉類型隶症,并指明其底層數(shù)據(jù)類型政模。這樣做可以確保枚舉是用開發(fā)者所選的底層數(shù)據(jù)類型實(shí)現(xiàn)出來的,而不會(huì)采用編譯器所選的類型沿腰。
在處理枚舉類型的switch語句中不要實(shí)現(xiàn)default分支览徒。這樣的話,加入新枚舉之后颂龙,編譯器就會(huì)提示開發(fā)者:switch語句并未處理所有枚舉。