_objc_msgForward

_objc_msgForward是一個(gè)函數(shù)指針(和 IMP 的類型一樣)运沦,是用于消息轉(zhuǎn)發(fā)的:當(dāng)向一個(gè)對(duì)象發(fā)送一條消息县习,但它并沒(méi)有實(shí)現(xiàn)的時(shí)候涮母,_objc_msgForward會(huì)嘗試做消息轉(zhuǎn)發(fā)。

結(jié)合《NSObject官方文檔》躁愿,排除掉 NSObject 做的事叛本,剩下的就是_objc_msgForward消息轉(zhuǎn)發(fā)做的幾件事:

  • 調(diào)用resolveInstanceMethod:方法 (或 resolveClassMethod:)。允許用戶在此時(shí)為該 Class 動(dòng)態(tài)添加實(shí)現(xiàn)彤钟。如果有實(shí)現(xiàn)了来候,則調(diào)用并返回YES,那么重新開(kāi)始o(jì)bjc_msgSend流程逸雹。這一次對(duì)象會(huì)響應(yīng)這個(gè)選擇器营搅,一般是因?yàn)樗呀?jīng)調(diào)用過(guò)class_addMethod云挟。如果仍沒(méi)實(shí)現(xiàn),繼續(xù)下面的動(dòng)作转质。

  • 調(diào)用forwardingTargetForSelector:方法园欣,嘗試找到一個(gè)能響應(yīng)該消息的對(duì)象。如果獲取到休蟹,則直接把消息轉(zhuǎn)發(fā)給它沸枯,返回非 nil 對(duì)象。否則返回 nil 鸡挠,繼續(xù)下面的動(dòng)作辉饱。注意,這里不要返回 self 拣展,否則會(huì)形成死循環(huán)彭沼。

  • 調(diào)用methodSignatureForSelector:方法,嘗試獲得一個(gè)方法簽名备埃。如果獲取不到姓惑,則直接調(diào)用doesNotRecognizeSelector拋出異常。如果能獲取按脚,則返回非nil:創(chuàng)建一個(gè) NSlnvocation 并傳給forwardInvocation:于毙。

  • 調(diào)用forwardInvocation:方法,將第3步獲取到的方法簽名包裝成 Invocation 傳入辅搬,如何處理就在這里面了唯沮,并返回非ni。

  • 調(diào)用doesNotRecognizeSelector: 堪遂,默認(rèn)的實(shí)現(xiàn)是拋出異常介蛉。如果第3步?jīng)]能獲得一個(gè)方法簽名,執(zhí)行該步驟溶褪。

上面前4個(gè)方法均是模板方法币旧,開(kāi)發(fā)者可以override,由 runtime 來(lái)調(diào)用猿妈。最常見(jiàn)的實(shí)現(xiàn)消息轉(zhuǎn)發(fā):就是重寫(xiě)方法3和4吹菱,吞掉一個(gè)消息或者代理給其他對(duì)象都是沒(méi)問(wèn)題的

也就是說(shuō)_objc_msgForward在進(jìn)行消息轉(zhuǎn)發(fā)的過(guò)程中會(huì)涉及以下這幾個(gè)方法:

  • resolveInstanceMethod:方法 (或 resolveClassMethod:)。

  • forwardingTargetForSelector:方法

  • methodSignatureForSelector:方法

  • forwardInvocation:方法

  • doesNotRecognizeSelector: 方法

直接調(diào)用_objc_msgForward是非常危險(xiǎn)的事彭则,如果用不好會(huì)直接導(dǎo)致程序Crash鳍刷,但是如果用得好,能做很多非掣┒叮酷的事输瓜。

就好像跑酷,干得好,叫“饲岸唬酷”,干不好就叫“作死”担忧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芹缔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瓶盛,更是在濱河造成了極大的恐慌最欠,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惩猫,死亡現(xiàn)場(chǎng)離奇詭異芝硬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)轧房,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)拌阴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人奶镶,你說(shuō)我怎么就攤上這事迟赃。” “怎么了厂镇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵纤壁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我捺信,道長(zhǎng)酌媒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任迄靠,我火速辦了婚禮秒咨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梨水。我一直安慰自己拭荤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布疫诽。 她就那樣靜靜地躺著舅世,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奇徒。 梳的紋絲不亂的頭發(fā)上雏亚,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音摩钙,去河邊找鬼罢低。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的网持。 我是一名探鬼主播宜岛,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼功舀!你這毒婦竟也來(lái)了萍倡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辟汰,失蹤者是張志新(化名)和其女友劉穎列敲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體帖汞,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戴而,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翩蘸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片所意。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖催首,靈堂內(nèi)的尸體忽然破棺而出扁眯,到底是詐尸還是另有隱情,我是刑警寧澤翅帜,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布姻檀,位于F島的核電站,受9級(jí)特大地震影響涝滴,放射性物質(zhì)發(fā)生泄漏绣版。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一歼疮、第九天 我趴在偏房一處隱蔽的房頂上張望杂抽。 院中可真熱鬧,春花似錦韩脏、人聲如沸缩麸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杭朱。三九已至,卻和暖如春吹散,著一層夾襖步出監(jiān)牢的瞬間弧械,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工空民, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刃唐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像画饥,于是被迫代替她去往敵國(guó)和親衔瓮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉抖甘,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評(píng)論 0 9
  • 消息發(fā)送和轉(zhuǎn)發(fā)流程可以概括為:消息發(fā)送(Messaging)是 Runtime 通過(guò) selector 快速查找 ...
    lylaut閱讀 1,827評(píng)論 2 3
  • 說(shuō)明:面試題來(lái)源是微博@我就叫Sunny怎么了的這篇博文:《招聘一個(gè)靠譜的 iOS》报辱,其中共55題,除第一題為糾錯(cuò)...
    __Lex閱讀 682評(píng)論 0 4
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 749評(píng)論 0 1
  • 【十三】 這紅色单山,像是一攤黑色的血水,爬在上面幅疼,只留了邊邊角角的空隙米奸,依稀讓人看出,曾經(jīng)這是一張精心勾勒出的小像...
    辣么大之閱讀 391評(píng)論 0 1