Objective-C 與C++ , java 等面向?qū)ο蟮恼Z言類似,若是使用過其中非 OC 的另一種語言,那么就能理解OC 所用的許多范式 與模板。
但是感覺語法很陌生是不是?
那是因為OC 使用的是“消息結(jié)構(gòu)”(message structure) 而非“函數(shù)調(diào)用” (function calling)。
OC 是Smalltalk 演化來的,smalltalk是消息型語言的鼻祖。
消息與函數(shù)調(diào)用之間的區(qū)別看上去就像下面這樣:
// Message (OC)
Object *obj = [ Object new ];
[obj performWith:parameter1 and parameter2];
//Function calling
Object *obj = new Object;
obj ->perfrom (parammeter1, parameter2);
關(guān)鍵區(qū)別在于:使用消息結(jié)構(gòu)的語言,其運行時所應(yīng)執(zhí)行的代碼由環(huán)境運行來決定;而是用函數(shù)調(diào)用的語言,則由編譯器決定。如果范例中調(diào)用的函數(shù)是多態(tài)的,那么在運行時就要按照“虛方法表”來查處到底應(yīng)該執(zhí)行那個函數(shù)的實現(xiàn)。而采用消息結(jié)構(gòu)的語言, 不論是否多態(tài),總是在運行時才回去查找所要執(zhí)行的方法。實際上,編譯器甚至都不關(guān)心接收消息的對象時何種類型。接收消息的對象問題也要在運行時處理,其過程叫做“動態(tài)綁定”(dynamic binding)。
運行期組件:OC 的重要工作都由“運行期組件”(runtime component)而非編譯器來完成。使用OC的面向?qū)ο筇匦缘乃璧娜繑?shù)據(jù)結(jié)構(gòu)及函數(shù)都在運行期組件里。舉例來說:運行期組件里包含全部內(nèi)存管理方法。運行期組件本質(zhì)上就是一種與開發(fā)者所編寫的代碼相鏈接的動態(tài)庫,齊代碼能把開發(fā)者編寫的所有程序粘合起來,這樣的話,只需更新運行期組件,即可提升應(yīng)用程序性能。
所有OC語言的對象所占內(nèi)存總是費陪在堆空間(heap space)中,而絕對不會分配在棧上 (stack)。 (不信寫行代碼試試?)

thatString 變量指向分配在堆空間里的某塊內(nèi)存,其中含有一個NSString對象,也就是說再創(chuàng)建一個變量,令其指向同一地址,那么并不拷貝該對象,只是這兩個變量會同時指向此對象。

只有一個NSString實例,然而有2 個變量指向此實例,兩個變量都是NSString* 型,這說明當(dāng)前棧幀李分配了2 快內(nèi)存,每塊內(nèi)存的大小都能容下一枚指針,這2 塊內(nèi)存里的值 都一樣,就是NSString實例的內(nèi)存地址。
下面的圖描述了此時的內(nèi)存布局。存放在NSString實例中的數(shù)據(jù)含有代表字符串實際內(nèi)容的字節(jié)。

注意: 分配在堆中的內(nèi)存必須直接管理,而分配在棧上用于保存變量的內(nèi)存則會在其棧幀彈出時自動清理。
OC將堆內(nèi)存管理抽象出來了,不需要malloc及free來分配或釋放對象所占內(nèi)存。OC運行期環(huán)境把這部分工作抽象為一套內(nèi)存管理架構(gòu),名為“引用計數(shù)”。
要點: 1,OC 為C語言添加了面向?qū)ο筇匦裕瞧涑C 使用動態(tài)綁定的消息結(jié)構(gòu), 就是說,在運行時才會檢查對象類型。接受一條消息后,究竟應(yīng)執(zhí)行何種代碼,是由運行期環(huán)境,而非編譯器來決定。
 
  | 
新聞熱點
疑難解答