關(guān)于objc_msgSend的理解

今天讀了一下Effective Objective-C 2.0 的第11條析二,下面做一下紀錄和理解

靜態(tài)綁定和動態(tài)綁定

書中關(guān)于這個描述給了一個例子:

void do1(int type){

if(type == 0){

printA();

}else{

printB();

}

}

void do2(int type){

void(*func)();

if(type == 0){

func = printA;

}else {

func= printB;

}

func();

}

那么對于函數(shù)do1,就是靜態(tài)綁定妒御,對于函數(shù)do2,就是動態(tài)綁定甘桑,為什么呢茬高?

這個是do1執(zhí)行時的指令瘩欺,我們看到printA和printB的地址被硬編碼在指令調(diào)用中结胀,在編譯期就知道printA和printB所在位置,可以直接過去普监。

這個是do2的執(zhí)行指令贵试,在指令call時,我們無法在編譯后直接知道所要調(diào)用函數(shù)地址凯正,需要通過上面運行時毙玻,指令計算的來,那么這就可以認為是動態(tài)綁定廊散,所謂的動態(tài)也就是運行時淆珊。

objc_msgSend()

當(dāng)我們“調(diào)用”方法時,在OC中稱之為傳遞消息奸汇,對象接收到消息后施符,會去“方法列表“中尋找,本類中找不到則向上找擂找,如果一直找不到戳吝,則進行”消息轉(zhuǎn)發(fā)“。那么OC是如何進行消息傳遞的呢贯涎?

在OC中听哭,所有的方法底層都是C語言的函數(shù)庸汗,當(dāng)我們向一個對象發(fā)送一條消息時闰渔,編譯器會將其轉(zhuǎn)換為一個C函數(shù) objc_msgSend(),這個函數(shù)會動態(tài)幫我們綁定要執(zhí)行的函數(shù)襟齿。

既然這個函數(shù)可以幫我們動態(tài)綁定要執(zhí)行的函數(shù)贞绳,那我們是否可以直接使用它來執(zhí)行函數(shù)呢?當(dāng)然可以洞难,但是要注意:

id objc_msgSend(id self, SEL op, ...)

這個是函數(shù)的原型逞姿,單如果直接使用扫步,編譯器會報錯objc_msgSend(person,@selector(age)) Too many arguments to function call ,expected 0,have 2! why????

其實這個我們在使用時函數(shù)的原型應(yīng)該是這個

void objc_msgSend(void /* id self, SEL op, ... */ )

官方說了妻顶,我們應(yīng)該這么辦:

These functions must be cast to an appropriate function pointer type?before being called

其實我們可以看編譯器是怎么做的酸员,[p age]會編譯成如下形式

((int (*)(id, SEL))(void *)objc_msgSend)((id)p, sel_registerName("age"));

好了就是這樣,轉(zhuǎn)換吧讳嘱。

不是所有的消息傳遞都會變成objc_msgSend,還有一些其他的

use objc_msgSend_stret for some struct return types.

use objc_msgSend_fpret for some float return types.

use objc_msgSend_fp2ret for some float return types.

如果給超類發(fā)送消息幔嗦,還有相應(yīng)的函數(shù)如 obj_msgSendSuper(),當(dāng)然這寫函數(shù)在使用時都需要進行類型轉(zhuǎn)換。

最后書中還提了一下這個“尾調(diào)用優(yōu)化”沥潭,這個可以去看阮一峰的這片文章尾調(diào)用優(yōu)化 - 阮一峰的網(wǎng)絡(luò)日志

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邀泉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汇恤,老刑警劉巖庞钢,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屁置,居然都是意外死亡焊夸,警方通過查閱死者的電腦和手機仁连,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門蓝角,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饭冬,你說我怎么就攤上這事使鹅。” “怎么了昌抠?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵患朱,是天一觀的道長。 經(jīng)常有香客問我炊苫,道長裁厅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任侨艾,我火速辦了婚禮执虹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唠梨。我一直安慰自己袋励,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布当叭。 她就那樣靜靜地躺著茬故,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚁鳖。 梳的紋絲不亂的頭發(fā)上磺芭,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音醉箕,去河邊找鬼徘跪。 笑死,一個胖子當(dāng)著我的面吹牛琅攘,可吹牛的內(nèi)容都是我干的垮庐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坞琴,長吁一口氣:“原來是場噩夢啊……” “哼哨查!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起剧辐,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寒亥,失蹤者是張志新(化名)和其女友劉穎邮府,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溉奕,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡褂傀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了加勤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仙辟。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鳄梅,靈堂內(nèi)的尸體忽然破棺而出叠国,到底是詐尸還是另有隱情,我是刑警寧澤戴尸,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布粟焊,位于F島的核電站,受9級特大地震影響孙蒙,放射性物質(zhì)發(fā)生泄漏项棠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一挎峦、第九天 我趴在偏房一處隱蔽的房頂上張望香追。 院中可真熱鬧,春花似錦浑测、人聲如沸翅阵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掷匠。三九已至,卻和暖如春岖圈,著一層夾襖步出監(jiān)牢的瞬間讹语,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工蜂科, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留顽决,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓导匣,卻偏偏與公主長得像才菠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贡定,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉赋访,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,715評論 0 9
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言,那么這個「動態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,195評論 0 7
  • 本文詳細整理了 Cocoa 的 Runtime 系統(tǒng)的知識蚓耽,它使得 Objective-C 如虎添翼渠牲,具備了靈活的...
    lylaut閱讀 800評論 0 4
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 761評論 0 1
  • 你所習(xí)以為常的,并不一定是對的步悠;你所恐懼的签杈,并不一定如你想象的可怕;你所堅持的鼎兽,必將擺渡你的靈魂答姥。 《擺渡人...
    文字在跳舞閱讀 460評論 4 2