OC 使用“消息結構”(messaging structure)而非“函數調用”(function calling)。
OC 由Smalltalk 轉化而來,后者是消息型語言的鼻祖。
消息與函數調用的區別在于:
- 消息結構的語言,運行時所執行的代碼由運行環境所決定,消息調用的時候不論是否多態,總是在運行時才會查找索要執行的方法。實際上,編譯器甚至不關心接收消息的對象是何種類,接收消息的對象問題也會在運行時處理,其過程叫做“動態綁定”(dynamic binding)
- 使用函數調用的語言,運行時所執行的代碼則由編譯器決定。
如果函數調用是多態的,那么運行時就需要按照“虛方法表”(virtual table)來查出到底應該執行哪個函數實現。
那么什么是虛方法表呢?
虛方法表是編程語言為實現“動態派發”(dynamic dispatch)或者運行時綁定(runtime method binding)而采用的一種機制。
Objective-C 的重要工作都由“運行期組件”(runtime component)而非編譯器完成。使用Objective-C的面相對象所需的全部數據結構及函數都在運行期組件里面。運行期組件本質上就是一個與開發者所編寫代碼相鏈接的“動態庫”(dynamic library),其代碼能把開發者編寫的所有程序粘合起來。
OC的指針是用來指示對象的,聲明一個變量,令其指代某個對象:
NSString * someVariable = @"the string"
上面的代碼中,變量someVariable是一個類型為 NSString * 的指針,指向對象 @"the string"
NSString * a = @"str"
NSString * b = a
上面代碼中指針a,b均指向同一個內存地址:@"str" 的內存地址
OC 為C語言添加了面相對象特性,是其超集。
OC 中對象所占內存總是分配在“堆空間”(heap space)中,而絕不會分配在“?!保╯tack)上。
分配在堆中的內存必須直接管理,而分配在棧中用于保存變量的內存則會在其棧楨彈出時自動清理。
除非必要,否則不要引入頭文件。一般來說,應在某個類的頭文件中使用向前聲明來提及別的類,并在實現文件中引入那些類的頭文件。這樣做可以盡量降低類之間的耦合。
有時無法使用向前聲明,比如要聲明某個類遵循一項協議。這種情況下,盡量把“該類遵循某協議”的這條聲明移至“class-continuation分類”中。如果不行的話,就把協議單獨放在一個頭文件中,然后將其引入。