Effective Object-C 讀書(shū)筆記

OC 使用“消息結(jié)構(gòu)”(messaging structure)而非“函數(shù)調(diào)用”(function calling)。
OC 由Smalltalk 轉(zhuǎn)化而來(lái),后者是消息型語(yǔ)言的鼻祖。

消息與函數(shù)調(diào)用的區(qū)別在于:
  • 消息結(jié)構(gòu)的語(yǔ)言,運(yùn)行時(shí)所執(zhí)行的代碼由運(yùn)行環(huán)境所決定,消息調(diào)用的時(shí)候不論是否多態(tài),總是在運(yùn)行時(shí)才會(huì)查找索要執(zhí)行的方法。實(shí)際上,編譯器甚至不關(guān)心接收消息的對(duì)象是何種類(lèi),接收消息的對(duì)象問(wèn)題也會(huì)在運(yùn)行時(shí)處理,其過(guò)程叫做“動(dòng)態(tài)綁定”(dynamic binding)
  • 使用函數(shù)調(diào)用的語(yǔ)言,運(yùn)行時(shí)所執(zhí)行的代碼則由編譯器決定。
    如果函數(shù)調(diào)用是多態(tài)的,那么運(yùn)行時(shí)就需要按照“虛方法表”(virtual table)來(lái)查出到底應(yīng)該執(zhí)行哪個(gè)函數(shù)實(shí)現(xiàn)。

那么什么是虛方法表呢?
虛方法表是編程語(yǔ)言為實(shí)現(xiàn)“動(dòng)態(tài)派發(fā)”(dynamic dispatch)或者運(yùn)行時(shí)綁定(runtime method binding)而采用的一種機(jī)制。

Objective-C 的重要工作都由“運(yùn)行期組件”(runtime component)而非編譯器完成。使用Objective-C的面相對(duì)象所需的全部數(shù)據(jù)結(jié)構(gòu)及函數(shù)都在運(yùn)行期組件里面。運(yùn)行期組件本質(zhì)上就是一個(gè)與開(kāi)發(fā)者所編寫(xiě)代碼相鏈接的“動(dòng)態(tài)庫(kù)”(dynamic library),其代碼能把開(kāi)發(fā)者編寫(xiě)的所有程序粘合起來(lái)。

OC的指針是用來(lái)指示對(duì)象的,聲明一個(gè)變量,令其指代某個(gè)對(duì)象:

NSString * someVariable = @"the string"

上面的代碼中,變量someVariable是一個(gè)類(lèi)型為 NSString * 的指針,指向?qū)ο?@"the string"

NSString * a = @"str"
NSString * b = a

上面代碼中指針a,b均指向同一個(gè)內(nèi)存地址:@"str" 的內(nèi)存地址

OC 為C語(yǔ)言添加了面相對(duì)象特性,是其超集。

OC 中對(duì)象所占內(nèi)存總是分配在“堆空間”(heap space)中,而絕不會(huì)分配在“棧”(stack)上。
分配在堆中的內(nèi)存必須直接管理,而分配在棧中用于保存變量的內(nèi)存則會(huì)在其棧楨彈出時(shí)自動(dòng)清理。

除非必要,否則不要引入頭文件。一般來(lái)說(shuō),應(yīng)在某個(gè)類(lèi)的頭文件中使用向前聲明來(lái)提及別的類(lèi),并在實(shí)現(xiàn)文件中引入那些類(lèi)的頭文件。這樣做可以盡量降低類(lèi)之間的耦合。

有時(shí)無(wú)法使用向前聲明,比如要聲明某個(gè)類(lèi)遵循一項(xiàng)協(xié)議。這種情況下,盡量把“該類(lèi)遵循某協(xié)議”的這條聲明移至“class-continuation分類(lèi)”中。如果不行的話,就把協(xié)議單獨(dú)放在一個(gè)頭文件中,然后將其引入。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容