Objective-C 起源
Objective-C語(yǔ)言是有 Smalltalk 演化而來(lái)乐纸,使用消息結(jié)構(gòu)
而非函數(shù)調(diào)用
。
消息結(jié)構(gòu)和函數(shù)調(diào)用的區(qū)別:
1.使用消息結(jié)構(gòu)的語(yǔ)言缩擂,運(yùn)行時(shí)所執(zhí)行的代碼由運(yùn)行環(huán)境決定眯勾。
2.使用函數(shù)調(diào)用的語(yǔ)言湃番,由編譯器決定。
函數(shù)調(diào)用的語(yǔ)言,如果某個(gè)函數(shù)是多態(tài)的捞蛋,只在運(yùn)行時(shí)會(huì)根據(jù)“虛函數(shù)表”查找到對(duì)應(yīng)的具體要執(zhí)行的函數(shù)孝冒。
而消息結(jié)構(gòu)的語(yǔ)言,所有的方法都是在運(yùn)行時(shí)去查找所要執(zhí)行的方法拟杉。
這就是為什么 runtime 那么強(qiáng)大的原因庄涡,可以在運(yùn)行時(shí)去改變?cè)即a的執(zhí)行邏輯。
要點(diǎn):
Objective-C 使用動(dòng)態(tài)綁定的消息結(jié)構(gòu)搬设,在運(yùn)行時(shí)才會(huì)檢查對(duì)象類型穴店。接受一條消息之后,究竟應(yīng)執(zhí)行何種代碼拿穴,由運(yùn)行環(huán)境決定而非編譯器決定泣洞。
在類的頭文件中盡可能少引入其他頭文件
前向聲明: @class EOCEmployer
前向聲明只是告訴有個(gè)這個(gè)類,但是具體的屬性默色,方法不知道球凰。
好處:
1.避免類之間相互引用,降低類之間的耦合度
2.縮短編譯時(shí)間
如果兩個(gè)類相互引用腿宰,雖然#import 不會(huì)引起死循環(huán)呕诉,但是其中一個(gè)類無(wú)法正確編譯。
多用字面量語(yǔ)法吃度,少用與之等價(jià)的方法(語(yǔ)法糖)
應(yīng)該使用字面量語(yǔ)法來(lái)創(chuàng)建字符串甩挫,數(shù)值,數(shù)組椿每,字典伊者。與創(chuàng)建此類對(duì)象的常規(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央碟。
NSNumber *number = @1;
NSString * string = @"string";
NSArray * array = @[@1,@2,@3];
NSDictionary * dictionary = @{@"name":@"wangbo",@"qq":@"91224867"};
array[1];
dictionary[@"name"];
多用常量類型,少用#define 預(yù)處理指令均函。
不要使用預(yù)處理指令定義常量亿虽,這樣定義出來(lái)的常量不包含類型信息,編譯器只是在編譯前執(zhí)行查找并替換苞也。
在實(shí)現(xiàn)文件中使用 static const 來(lái)定義“只在編譯單元內(nèi)可見(jiàn)的常量”洛勉。由于此類常量不在全局符號(hào)表中,所以無(wú)須為其名稱加類前綴如迟,一般加 k
在頭文件中使用 extern來(lái)聲明全局常量收毫,并在相關(guān)實(shí)現(xiàn)文件中定義其值攻走。這種常量要出現(xiàn)在全局符號(hào)表中,所以一般用類前綴加一個(gè)區(qū)分此再。
// 在實(shí)現(xiàn)文件中
static const NSTimeInterval kAnimationDuration = 0.3;
// 在頭文件中
extern NSString * const NIPLoginManagerDidLoginNotification;
// 在實(shí)現(xiàn)文件中
NSString *const NIPLoginManagerDidLoginNotification = @"VALUE";