Objective-C Runtime(2)

上一篇Runtime中介紹了類最終都是以C語言結構體的形式展現,那麼C語言中結構體是什麼樣的有哪些特新和作用呢?

結構體

在C語言中結構體是一種集合,比如包含基礎數據類型的int,char ,double等等,可以包含我們想要的數據。結構體也是一種數據類型,我們一顆創建一個結構體,並對其進行修改。結構體本身不佔用內存空間,結構體變量佔用一塊連續的內存空間。

上一篇中我們提到OC的類最終是C語言的結構,而C語言中結構體可以修改。那麼我們是不是可以通過修改C語言的結構體,來影響OC中的類呢。

當然Objective-C是允許我們使用C語言來進行開發的。我們已經知道了類的表現,那麼類的調用又是什麼樣的的,這裏我們引入消息機制。

消息機制

消息機制,就是在使用某一類的方法的時候我們通過發送消息的形式,而不是通過調用,調用是編譯的時候已經確定了你要執行的動作,也是調用確定的方法。確實有點繞,我們明白消息就可以了。

比如我們執行一個Person的方法:

- (void)actionMethod{
    NSLog(@"%s", "run");
}
Person *teach = [[Person alloc] init];

//執行actionMethod方法
[teach actionMethod];

Person實例teach 執行actionMethod方法的綁定是通過運行時,那麼編譯的時候會變成什麼,我們來看

編譯器會將消息的發送轉化成objc_msgSend方法,可以在”objc/message.h”頭文件中查看

/*
    * receiver 消息的發送者
    * selector 執行的方法
    * arg1     參數1
    * arg2     參數2
    * ……
*/
objc_msgSend(receiver, selector, arg1, arg2, …);

[teach actionMethod]在編譯的時候:

objc_msgSend(teach, sel_registerName("actionMethod"));

那麼objc_msgSend這個方法在什麼時候完成動態綁定呢?

  • 1.首先通過receiver(teach類)查找selector(actionMethod)的實現

  • 2.調用該實現,並將一系列參數傳遞過去(actionMethod沒有參數就不傳)

  • 3.將該實現的返回值作爲自己的返回值,返回(actionMethod沒有返回值)

下面我們開看看方法查找的過程,結合之前介紹的結構體

  • 1.通過對象的isa指針找到對應類

  • 2.在objc_cache緩存中去找對應的selector,找到就完成綁定

  • 3.沒有找到,在objc_method列表中找,找到就先加入緩存,完成綁定

  • 4.還沒有找到,就在super_class的指針指向父類的結構體中查找,直到找到

我們直到完成方法綁定實在運行的時候,那麼我們就可以通過Runtime修改方法的實現然後完成綁定。

PS

下一篇中介”objc/runtime.h”庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章