Objective-C runtime(一) 消息傳遞機(jī)制

對(duì)Objective-C 等面向?qū)ο笳Z言來說,『對(duì)象』(object)就是『基本構(gòu)造單元』,開發(fā)者可以通過對(duì)象來存儲(chǔ)并傳遞數(shù)據(jù)。在對(duì)象之間傳遞數(shù)據(jù)并執(zhí)行任務(wù)的過程就叫做『消息傳遞』。

Objective-C 是C 的超集,我們先來理解C語言的函數(shù)調(diào)用方式。
C語言使用『靜態(tài)綁定』(static binding)。編譯器在編譯代碼的時(shí)候就已經(jīng)知道程序中的函數(shù),會(huì)直接生成調(diào)用相關(guān)函數(shù)的指令。
不同于C,在Objective-C中,如果向某對(duì)象傳遞消息,會(huì)使用『動(dòng)態(tài)綁定』(dynamic binding)機(jī)制來決定需要調(diào)用的方法。在底層,所有方法都是普通的C語言函數(shù),然而對(duì)象收到消息之后,究竟該調(diào)用哪個(gè)方法則完全取決于運(yùn)行期決定,甚至可以在程序運(yùn)行時(shí)改變

給對(duì)象發(fā)送一條消息

id returenValue = [someObject messageName:parameter];

在本例中,someObject是消息的『接收者』(receiver),messageName是『選擇器』(selector)即方法名。
編譯器看到這條消息后,將其轉(zhuǎn)換為一條標(biāo)準(zhǔn)的C語言函數(shù)使用,所調(diào)用的函數(shù)是消息傳遞機(jī)制中的核心函數(shù),叫做objc_msgSend,原形如下:

void objc_msgSend(id self, SEL cmd, ...);

這個(gè)是『參數(shù)個(gè)數(shù)可變的函數(shù)』,能接受兩個(gè)或者兩個(gè)以上的參數(shù)。第一個(gè)參數(shù)代表接收者,第二個(gè)參數(shù)代表選擇器,后續(xù)參數(shù)是消息中的那些參數(shù),其順序不變。

id returnValue = objc_msgSend(someObject , @selector(message:) , parameter);

objc_msgSend函數(shù)會(huì)依據(jù)接收者與選擇器的類型來調(diào)用適當(dāng)?shù)姆椒?。該方法需要在接收者所屬的類中搜尋其『方法列表』,如果能找到與選擇器名稱相符的方法,就跳至其實(shí)現(xiàn)代碼。若是找不到,那就沿著繼承體系繼續(xù)向上查找,等找到合適的方法之后再跳轉(zhuǎn)。如果最終還是找不到相符的方法,就執(zhí)行『消息轉(zhuǎn)發(fā)』(message forwarding)。(后續(xù)介紹)
這一套就是『動(dòng)態(tài)消息派發(fā)系統(tǒng)』(dynamic message dispatch system)。發(fā)送給對(duì)象的全部消息都由其處理,該系統(tǒng)會(huì)查出對(duì)應(yīng)的方法,并執(zhí)行其代碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容