回顧日記3-消息轉(zhuǎn)發(fā)機(jī)制

當(dāng)一個對象接收到無法解讀的消息時,就會啟動消息轉(zhuǎn)發(fā)(message forwording)機(jī)制费什。coder可經(jīng)由此過程告訴對象應(yīng)該如何處理位置消息。例如給某一個對象實(shí)例發(fā)送了一個該對象不存在的方法丁溅,最后就會crash掉啦膜。

-[NSCFDictionary indexOfObject:]: unrecognized selector sent to instance 0x233300555

進(jìn)行一次發(fā)送消息會在相關(guān)的類對象中搜索方法列表,如果找不到則會沿著繼承樹向上一直搜索知道繼承樹根部(通常為NSObject)胃榕,如果還是找不到并且消息轉(zhuǎn)發(fā)都失敗了就回執(zhí)行doesNotRecognizeSelector:方法報unrecognized selector錯盛险。那么消息轉(zhuǎn)發(fā)到底是什么呢?接下來將會逐一介紹最后的三次機(jī)會勋又。

消息轉(zhuǎn)發(fā)分為兩大階段苦掘。

第一階段先詢問接受對象所屬的類是否能夠動態(tài)添加方法,以處理這個unknown selector赐写,這叫做動態(tài)方法解析(dynamic method resolution).

第二階段設(shè)計完整的消息轉(zhuǎn)發(fā)機(jī)制(full forwording mechanism)鸟蜡。

如果在運(yùn)行期,系統(tǒng)已經(jīng)把第一階段執(zhí)行完了挺邀,那么接受者自己就無法再以動態(tài)添加方法的方式來響應(yīng)包含該unknown selector的消息了揉忘。此時,運(yùn)行期系統(tǒng)會請求接受者以

其他手段來處理與消息相關(guān)的方法調(diào)用端铛。這里又分為兩小步:

2.1 首先泣矛,接受者查看是否有其他對象能處理這條消息,若有禾蚕,則運(yùn)行時系統(tǒng)會將消息轉(zhuǎn)給那個對象您朽,一切如常。

2.2 若沒有可替代的接受者(replacement receiver)换淆,則啟動完整的消息轉(zhuǎn)發(fā)機(jī)制哗总,運(yùn)行時系統(tǒng)會把與消息有關(guān)的全部細(xì)節(jié)都封裝到NSInvocation對象中,再給接受者最后一次機(jī)會倍试,令其設(shè)法解決當(dāng)前還未處理的消息讯屈。

所屬類動態(tài)方法解析

//實(shí)例方法使用這個 +(BOOL)resolveInstanceMethod:(SEL)sel;

//類方法使用這個 +(BOOL)resolveClassMethod:(SEL)sel县习;


1


2

如果上述返回NO的話涮母,就是不做動態(tài)方法解析谆趾,就會進(jìn)行到下一步

備援接收者

當(dāng)對象所屬類不能動態(tài)添加方法后,runtime就會詢問當(dāng)前的接受者是否有其他對象可以處理這個未知的selector叛本,相關(guān)方法聲明如下:

- (id)forwardingTargetForSelector:(SEL)aSelector;

該方法的參數(shù)就是那個未知的selector沪蓬,這是一個實(shí)例方法,因?yàn)槭窃儐栐搶?shí)例對象是否有其他實(shí)例對象可以接收這個未知的selector来候,如果沒有就返回nil跷叉,可以自行實(shí)驗(yàn)。

消息重定向

當(dāng)沒有備援接收者時营搅,就只剩下最后一次機(jī)會性芬,那就是消息重定向。這個時候runtime會將未知消息的所有細(xì)節(jié)都封裝為NSInvocation對象剧防,然后調(diào)用下述方法:

- (void)forwardInvocation: (NSInvocation*)invocation;

調(diào)用這個方法如果不能處理就會調(diào)用父類的相關(guān)方法植锉,一直到NSObject的這個方法,如果NSObject都無法處理就會調(diào)用doesNotRecognizeSelector:方法拋出異常峭拘。

下圖是整個消息轉(zhuǎn)發(fā)機(jī)制


3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俊庇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸡挠,更是在濱河造成了極大的恐慌辉饱,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拣展,死亡現(xiàn)場離奇詭異彭沼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)备埃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門姓惑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人按脚,你說我怎么就攤上這事于毙。” “怎么了辅搬?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵唯沮,是天一觀的道長。 經(jīng)常有香客問我堪遂,道長介蛉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任溶褪,我火速辦了婚禮币旧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竿滨。我一直安慰自己佳恬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布于游。 她就那樣靜靜地躺著毁葱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贰剥。 梳的紋絲不亂的頭發(fā)上倾剿,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音蚌成,去河邊找鬼前痘。 笑死,一個胖子當(dāng)著我的面吹牛担忧,可吹牛的內(nèi)容都是我干的芹缔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼瓶盛,長吁一口氣:“原來是場噩夢啊……” “哼最欠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惩猫,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤芝硬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后轧房,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拌阴,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年奶镶,在試婚紗的時候發(fā)現(xiàn)自己被綠了迟赃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡厂镇,死狀恐怖捺氢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剪撬,我是刑警寧澤摄乒,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站残黑,受9級特大地震影響馍佑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梨水,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一拭荤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疫诽,春花似錦舅世、人聲如沸旦委。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缨硝。三九已至,卻和暖如春罢低,著一層夾襖步出監(jiān)牢的瞬間查辩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工网持, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宜岛,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓功舀,卻偏偏與公主長得像萍倡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辟汰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉遣铝,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評論 0 9
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言,那么這個「動態(tài)」表現(xiàn)在哪呢莉擒?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,182評論 0 7
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,132評論 0 9
  • 目錄 Objective-C Runtime到底是什么 Objective-C的元素認(rèn)知 Runtime詳解 應(yīng)用...
    Ryan___閱讀 1,935評論 1 3
  • 對象在收到無法解讀的消息會發(fā)生什么? 若想令類理解某條消息,必須有對應(yīng)的實(shí)現(xiàn)方法.但是,在編譯期間動態(tài)像對象添加方...
    有一種再見叫青春閱讀 571評論 0 2