參考博文:http://tech.glowing.com/cn/objective-c-runtime/
? ? ? objective-c擴展了C語言,并加入了面向對象的特性和Smalltalk的消息傳遞機制。而這個擴展的核心是用一個C和匯編語言寫的runtime庫。它是objective-c面向對象和動態機制的基石。
? ? ? objective-c是一個動態語言,這意味著它不僅需要一個編譯器,也需要一個運行時系統來動態創建類和對象,進行消息傳遞和轉發。理解runtime可以幫我們更好的了解這個語言,適當的時候還能夠對這個語言進行擴展,從系統層面解決設計和技術問題。可見:runtime的功能有如下幾個:
1.runtime來動態創建類和對象;
2.進行消息傳遞和轉發。
消息機制(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強調太多的人把主要關注度放到了對象上,然而那僅僅是lesser idea。big idea才是“Messaging”,最重要的是模塊間的溝通,而不是內部的行為和屬性應該是怎樣的。
在很多語言,例如C語言,調用一個方法其實就是跳到內存中的某一點并開始執行一段代碼。沒有任何動態的特性,因為這在編譯時就做好了。而在objective-c中,【object foo】語法并不會立即執行foo這個方法的代碼。它是在運行時給object發送一條叫做foo的消息。這個消息,也許會由object來處理,也許會被轉發給另一個對象,或者不予理睬假裝沒收到這個消息。多條不同的消息也許會對應同一個方法實現。這些都是在程序運行時候決定的。
事實上,在我們編寫oc代碼的后,編譯時會被編譯成一個c的函數調用-objc_msgSend()。比如:下邊兩行代碼是等效的:
[array insertObject:foo atIndex:5];
objc_msgSend(array,@selector(insertObject:atIndex:),foo,5);
消息傳遞的的關鍵藏于objc_object中的isa指針和objc_class中的class dispatch table。