上一篇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”庫。