objective-c之runtime簡介

參考博文:http://tech.glowing.com/cn/objective-c-runtime/

? ? ? objective-c擴(kuò)展了C語言,并加入了面向?qū)ο蟮奶匦院蚐malltalk的消息傳遞機(jī)制。而這個擴(kuò)展的核心是用一個C和匯編語言寫的runtime庫。它是objective-c面向?qū)ο蠛蛣討B(tài)機(jī)制的基石。

? ? ? objective-c是一個動態(tài)語言,這意味著它不僅需要一個編譯器,也需要一個運(yùn)行時系統(tǒng)來動態(tài)創(chuàng)建類和對象,進(jìn)行消息傳遞和轉(zhuǎn)發(fā)。理解runtime可以幫我們更好的了解這個語言,適當(dāng)?shù)臅r候還能夠?qū)@個語言進(jìn)行擴(kuò)展,從系統(tǒng)層面解決設(shè)計和技術(shù)問題。可見:runtime的功能有如下幾個:

1.runtime來動態(tài)創(chuàng)建類和對象;

2.進(jìn)行消息傳遞和轉(zhuǎn)發(fā)。


消息機(jī)制(Messaging)

I’m sorry that I long ago coined the term “objects” for this topic because it gets many people to focus on the lesser idea.The big idea is “messaging” – that is what the kernal[sic] of Smalltalk is all about... The key in making great and growable systems is much more to design how its modules communicate rather than what their internal properties and behaviors should be.

Alan強(qiáng)調(diào)太多的人把主要關(guān)注度放到了對象上,然而那僅僅是lesser idea。big idea才是“Messaging”,最重要的是模塊間的溝通,而不是內(nèi)部的行為和屬性應(yīng)該是怎樣的。

在很多語言,例如C語言,調(diào)用一個方法其實(shí)就是跳到內(nèi)存中的某一點(diǎn)并開始執(zhí)行一段代碼。沒有任何動態(tài)的特性,因?yàn)檫@在編譯時就做好了。而在objective-c中,【object foo】語法并不會立即執(zhí)行foo這個方法的代碼。它是在運(yùn)行時給object發(fā)送一條叫做foo的消息。這個消息,也許會由object來處理,也許會被轉(zhuǎn)發(fā)給另一個對象,或者不予理睬假裝沒收到這個消息。多條不同的消息也許會對應(yīng)同一個方法實(shí)現(xiàn)。這些都是在程序運(yùn)行時候決定的。

事實(shí)上,在我們編寫oc代碼的后,編譯時會被編譯成一個c的函數(shù)調(diào)用-objc_msgSend()。比如:下邊兩行代碼是等效的:

[array insertObject:foo atIndex:5];

objc_msgSend(array,@selector(insertObject:atIndex:),foo,5);

消息傳遞的的關(guān)鍵藏于objc_object中的isa指針和objc_class中的class dispatch table。

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

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

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