Objective-C消息機制的原理
在Objective-C中,message與方法的真正實現是在執行階段綁定的,而非編譯階段。編譯器會將消息發送轉換成對objc_msgSend方法的調用。
objc_msgSend方法含兩個必要參數:receiver、方法名(即:selector),如:
[receiver message]; 將被轉換爲:objc_msgSend(receiver, selector);
objc_msgSend方法也能hold住message的參數,如:
objc_msgSend(receiver, selector, arg1, arg2, …);
objc_msgSend方法會做按照順序進行以下操作,以完成動態綁定:
1. 查找selector所指代的程序(方法的真正實現)。因爲不同類對同一方法有不同的實現,所以對方法的真正實現的查找依賴於receiver的類
2. 調用該實現,並將一系列參數傳遞過去
3. 將該實現的返回值作爲自己的返回值,返回之
消息傳遞的關鍵是,編譯器構建每個類和對象時所採用的數據結構。每個類都包含以下兩個必要元素:
- 一個指向父類的指針。
- 一個調度表(dispatch table)。該調度表將類的selector與方法的實際內存地址關聯起來。
每個對象都有一個指向所屬類的指針isa。通過該指針,對象可以找到它所屬的類,也就找到了其全部父類,如下圖所示:
當向一個對象發送消息時,objc_msgSend方法根據對象的isa指針找到對象的類,然後在類的調度表(dispatch table)中查找selector。如果無法找到selector,objc_msgSend通過指向父類的指針找到父類,並在父類的調度表(dispatch table)中查找selector,以此類推直到NSObject類。一旦查找到selector,objc_msgSend方法根據調度表的內存地址調用該實現。
通過這種方式,message與方法的真正實現在執行階段才綁定。
爲了保證消息發送與執行的效率,系統會將全部selector和使用過的方法的內存地址緩存起來。每個類都有一個獨立的緩存,緩存包含有當前類自己的selector以及繼承自父類的selector。查找調度表(dispatch table)前,消息發送系統首先檢查receiver對象的緩存。
緩存命中的情況下,消息發送(messaging)比直接調用方法(function call)只慢一點點點點。
參考資料:
- Objective-C Runtime Programming Guide
- The Objective-C Programming Language
Objective-C消息機制的原理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Objective-C消息機制的原理
macroswang
2018-09-11 07:33:29
windows消息機制
好事多磨啊
2019-02-23 00:36:41
細說UI線程和Windows消息隊列
珉琥
2019-02-22 23:26:20
Windows消息機制
Norman_li
2019-02-22 21:42:26
Windows消息機制
Norman_li
2018-11-30 13:20:47
Windows消息機制
Norman_li
2018-11-30 13:20:47
細說UI線程和Windows消息隊列
珉琥
2018-09-12 06:46:41
windows消息機制
好事多磨啊
2018-09-11 07:48:53
WPF的消息機制(二)- WPF內部的5個窗口之隱藏消息窗口
powertoolsteam
2018-09-10 02:09:53
WPF的消息機制(一)- 讓應用程序動起來
powertoolsteam
2018-09-10 02:09:52
Android消息機制--Handler 深入解析(JAVA層)
Simon_Crystin
2018-08-22 03:55:43
Android中使用Handler造成內存泄露的分析和解決
Simon_Crystin
2018-08-22 03:55:43
一、objc庫
Miridescent
2018-11-13 06:53:48