理解 ojbc_msgSend 的作用

objc_msgSend

在 OC中,如果向某對(duì)象傳遞消息,那就會(huì)使用動(dòng)態(tài)綁定機(jī)制來(lái)決定需調(diào)用的方法
在底層,所以的方法都是 c函數(shù)。對(duì)象接受到消息之后,調(diào)用哪一個(gè)方法,在運(yùn)行期決定,甚至可以在程序運(yùn)行時(shí)決定

給對(duì)象發(fā)送消息的代碼

//在 oc 中發(fā)送消息就可以寫(xiě)成這樣
id returnValue = [someObject messageName:parameter];

//編譯器看到上面的代碼,就會(huì)轉(zhuǎn)換為 c 語(yǔ)言函數(shù)
void objc_msgSend(id self,SEL cmd,...) 
//可變參數(shù),意思就是想 self這個(gè)對(duì)象發(fā)送消息


//接受者-》someObject 選擇子(方法)-》messageName: 要這個(gè)接受者調(diào)用這個(gè)選擇子
id returnValue = objc_msgSend(someObject,@seletor(messageName:),parameter)

原理

objc_msgSend函數(shù)會(huì)依據(jù)接收者與選擇子的類(lèi)型來(lái)調(diào)用適當(dāng)?shù)姆椒?/p>

  1. 這個(gè)函數(shù)會(huì)在接收者的類(lèi)中搜尋其 方法列表.如果找到了就跳轉(zhuǎn)到其實(shí)現(xiàn)代碼。
  2. 如果沒(méi)有找到,就沿著繼承體系繼續(xù)向上查找,等找到合照的方法再跳轉(zhuǎn)
  3. 最后還是沒(méi)有找到的話,就執(zhí)行 消息轉(zhuǎn)發(fā)

特殊情況

  • objc_msgSend_stret如果發(fā)送的消息返回的是結(jié)構(gòu)體,就用這個(gè)函數(shù)處理。如果期存器能夠存下這個(gè)結(jié)構(gòu)體,就處理。不能的話,就消息派發(fā)。由分配在棧上的某個(gè)變量來(lái)處理消息返回的結(jié)構(gòu)體
  • objc_msgSend_fpret 如果消息返回的是浮點(diǎn)數(shù),就由這個(gè)函數(shù)處理
  • objc_msgSendSuper 如果要給超類(lèi)發(fā)送消息。例如[super message:parameter] 就由這個(gè)函數(shù)處理 另外還有兩個(gè)與上面的等效的函數(shù)。來(lái)處理super 的消息
最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • objc_getAssociatedObject返回與給定鍵的特定對(duì)象關(guān)聯(lián)的值。ID objc_getAssoci...
    有一種再見(jiàn)叫青春閱讀 1,745評(píng)論 0 7
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,032評(píng)論 0 9
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,874評(píng)論 33 466
  • 參數(shù)自一個(gè)指針,指向類(lèi)的要接收消息的實(shí)例。 OP在處理該信息的方法的選擇。 ......可變參數(shù)列表包含參數(shù)的方法...
    reallychao閱讀 887評(píng)論 0 0
  • 我發(fā)現(xiàn)自己好久都沒(méi)有認(rèn)真的曬娃并嘮娃了,今天中午兒子午睡的時(shí)候,我就想著打開(kāi)電腦寫(xiě)點(diǎn)兒啥吧!可能他還沒(méi)睡熟的緣故,...
    小確幸咩閱讀 709評(píng)論 0 0

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