Effective Object-C 讀書筆記

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í)行的方法。實際上,編譯器甚至不關(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ù)實現(xiàn)。

那么什么是虛方法表呢?
虛方法表是編程語言為實現(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)在某個類的頭文件中使用向前聲明來提及別的類,并在實現(xiàn)文件中引入那些類的頭文件。這樣做可以盡量降低類之間的耦合。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容