轉自:http://blog.jobbole.com/45963/
過去的幾年中湧現了大量的Objective-C開發人員。有些是從動態語言轉過來的,比如Ruby或Python,有些是從強型別語言轉過來的,如Java或C#,當然也有直接以Objective-C作為入門語言的。也就是說有很大一部分開發人員都沒有使用Objective-C太長時間。當你接觸一門新語言時,更多地會關注基礎知識,如文法和特性等。但通常有一些更進階的,更鮮為人知又有強大功能的特性等待你去開拓。
這篇文章主要是來領略下Objective-C的運行時(runtime),同時解釋是什麼讓Objective-C如此動態,然後感受下這些動態化的技術細節。希望這回讓你對Objective-C和Cocoa是如何啟動並執行有更好的瞭解。 The Runtime
Objective-C是一門簡單的語言,95%是C。只是在語言層面上加了些關鍵字和文法。真正讓Objective-C如此強大的是它的運行時。它很小但卻很強大。它的核心是訊息分發。 Messages
如果你是從動態語言如Ruby或Python轉過來的,可能知道什麼是訊息,可以直接跳過進入下一節。那些從其他語言轉過來的,繼續看。
執行一個方法,有些語言,編譯器會執行一些額外的最佳化和錯誤檢查,因為調用關係很直接也很明顯。但對於訊息分發來說,就不那麼明顯了。在發訊息前不必知道某個對象是否能夠處理訊息。你把訊息發給它,它可能會處理,也可能轉給其他的Object來處理。一個訊息不必對應一個方法,一個對象可能實現一個方法來處理多條訊息。
在Objective-C中,訊息是通過objc_msgSend()這個runtime方法及相近的方法來實現的。這個方法需要一個target,selector,還有一些參數。理論上來說,編譯器只是把訊息分發變成objc_msgSend來執行。比如下面這兩行代碼是等價的。
1 2 |
[ array insertObject : foo atIndex : 5 ] ; objc_msgSend ( array , @ selector ( insertObject : atIndex : ) , foo , 5 ) ; |
Objects, Classes, MetaClasses
大多數物件導向的語言裡有 classes 和 objects 的概念。Objects通過Classes產生。但是在Objective-C中,classes本身也是objects(譯者註:這點跟python很像),也可以處理訊息,這也是為什麼會有類方法和執行個體方法。具體來說,Objective-C中的Object是一個結構體(struct),第一個成員是isa,指向自己的class。這是在objc/objc.h中定義的。