OC 使用“消息結(jié)構(gòu)”(messaging structure)而非“函數(shù)調(diào)用”(function calling)躺涝。
OC 由Smalltalk 轉(zhuǎn)化而來,后者是消息型語言的鼻祖扼雏。
消息與函數(shù)調(diào)用的區(qū)別在于:
- 消息結(jié)構(gòu)的語言坚嗜,運(yùn)行時所執(zhí)行的代碼由運(yùn)行環(huán)境所決定,消息調(diào)用的時候不論是否多態(tài)诗充,總是在運(yùn)行時才會查找索要執(zhí)行的方法苍蔬。實(shí)際上,編譯器甚至不關(guān)心接收消息的對象是何種類蝴蜓,接收消息的對象問題也會在運(yùn)行時處理碟绑,其過程叫做“動態(tài)綁定”(dynamic binding)
- 使用函數(shù)調(diào)用的語言,運(yùn)行時所執(zhí)行的代碼則由編譯器決定茎匠。
如果函數(shù)調(diào)用是多態(tài)的格仲,那么運(yùn)行時就需要按照“虛方法表”(virtual table)來查出到底應(yīng)該執(zhí)行哪個函數(shù)實(shí)現(xiàn)。
那么什么是虛方法表呢诵冒?
虛方法表是編程語言為實(shí)現(xiàn)“動態(tài)派發(fā)”(dynamic dispatch)或者運(yùn)行時綁定(runtime method binding)而采用的一種機(jī)制凯肋。
Objective-C 的重要工作都由“運(yùn)行期組件”(runtime component)而非編譯器完成。使用Objective-C的面相對象所需的全部數(shù)據(jù)結(jié)構(gòu)及函數(shù)都在運(yùn)行期組件里面汽馋。運(yùn)行期組件本質(zhì)上就是一個與開發(fā)者所編寫代碼相鏈接的“動態(tài)庫”(dynamic library)侮东,其代碼能把開發(fā)者編寫的所有程序粘合起來午笛。
OC的指針是用來指示對象的,聲明一個變量苗桂,令其指代某個對象:
NSString * someVariable = @"the string"
上面的代碼中,變量someVariable是一個類型為 NSString * 的指針告组,指向?qū)ο?@"the string"
NSString * a = @"str"
NSString * b = a
上面代碼中指針a煤伟,b均指向同一個內(nèi)存地址:@"str" 的內(nèi)存地址
OC 為C語言添加了面相對象特性,是其超集木缝。
OC 中對象所占內(nèi)存總是分配在“堆空間”(heap space)中便锨,而絕不會分配在“棧”(stack)上我碟。
分配在堆中的內(nèi)存必須直接管理放案,而分配在棧中用于保存變量的內(nèi)存則會在其棧楨彈出時自動清理。
除非必要矫俺,否則不要引入頭文件吱殉。一般來說,應(yīng)在某個類的頭文件中使用向前聲明來提及別的類厘托,并在實(shí)現(xiàn)文件中引入那些類的頭文件友雳。這樣做可以盡量降低類之間的耦合。
有時無法使用向前聲明铅匹,比如要聲明某個類遵循一項(xiàng)協(xié)議押赊。這種情況下,盡量把“該類遵循某協(xié)議”的這條聲明移至“class-continuation分類”中包斑。如果不行的話流礁,就把協(xié)議單獨(dú)放在一個頭文件中,然后將其引入罗丰。