iOS 消息轉發(fā)

首先疚察,該方法在調用時,系統(tǒng)會查看這個對象能否接收這個消息(查看這個類有沒有這個方法宾袜,或者有沒有實現(xiàn)這個方法捻艳。),如果不能并且只在不能的情況下庆猫,就會調用下面這幾個方法认轨,給你“補救”的機會,你可以先理解為幾套防止程序crash的備選方案月培,我們就是利用這幾個方案進行消息轉發(fā)好渠,注意一點,前一套方案實現(xiàn)后一套方法就不會執(zhí)行节视。如果這幾套方案你都沒有做處理拳锚,那么程序就會報錯crash。

打個比方:比賽足球時寻行,腳下有球的那名球員霍掺,如果他的位置不利于射門或者他的球即將被對方球員搶斷,這時最好是把球傳出去,這里的球就相當于消息杆烁。

方案一:

+ (BOOL)resolveInstanceMethod:(SEL)sel

+ (BOOL)resolveClassMethod:(SEL)sel

方案二:

- (id)forwardingTargetForSelector:(SEL)aSelector

方案三:

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;

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

到目前為止大家已經(jīng)知道什么是消息轉發(fā)了牙丽。下面就說一下這幾套方案是怎樣調用的。

首先兔魂,系統(tǒng)會調用resolveInstanceMethod(當然烤芦,如果這個方法是一個類方法,就會調用resolveClassMethod)讓你自己為這個方法增加實現(xiàn)析校。

咱們來看一個例子:

首先构罗,創(chuàng)建了一個Person類的對象p,然后調用p的run方法智玻,注意遂唧,這個run方法是沒有寫實現(xiàn)的。


進入Person類的.m文件吊奢,我實現(xiàn)了resolveInstanceMethod這個方法為我的Person類動態(tài)增加了一個run方法的實現(xiàn)盖彭。(什么是動態(tài)增加?其實就是在程序運行的時候給某類的某個方法增加實現(xiàn)页滚。具體實現(xiàn)內(nèi)容就為上面的void run 這個c函數(shù)召边。)

當外部調用[p run]時,由于我們沒有實現(xiàn)run對應的方法裹驰,那么系統(tǒng)會調用resolveInstanceMethod讓你去做一些其他操作掌实。(當然,你也可以不做操作邦马,只是在這個例子中贱鼻,我為run方法動態(tài)增加了實現(xiàn)。)


繼續(xù)運行滋将,程序走到了我們C函數(shù)的部分邻悬,這樣程序沒有了崩潰。


下面講一下第二套方法随闽,forwardingTargetForSelector父丰,這個方法返回你需要轉發(fā)消息的對象。

我們接著這個例子來講掘宪,為了便于演示消息轉發(fā)蛾扇,我們新建了一個汽車類Car,并且實現(xiàn)了Car的run方法魏滚。


現(xiàn)在我不去對方案一的resolveInstanceMethod做任何處理镀首,直接調用父類方法∈蟠危可以看到更哄,系統(tǒng)已經(jīng)來到了forwardingTargetForSelector方法芋齿,我們現(xiàn)在返回一個Car類的實例對象。


繼續(xù)運行成翩,程序就來到了Car類的run方法觅捆,這樣,我們就實現(xiàn)了消息轉發(fā)麻敌。


繼續(xù)我們的例子栅炒。如果我們不實現(xiàn)forwardingTargetForSelector,系統(tǒng)就會調用方案三的兩個方法methodSignatureForSelector和forwardInvocation

methodSignatureForSelector用來生成方法簽名术羔,這個簽名就是給forwardInvocation中的參數(shù)NSInvocation調用的赢赊。

開頭我們要找的錯誤unrecognized selector sent to instance原因,原來就是因為methodSignatureForSelector這個方法中聂示,由于沒有找到run對應的實現(xiàn)方法,所以返回了一個空的方法簽名簇秒,最終導致程序報錯崩潰鱼喉。

所以我們需要做的是自己新建方法簽名,再在forwardInvocation中用你要轉發(fā)的那個對象調用這個對應的簽名趋观,這樣也實現(xiàn)了消息轉發(fā)扛禽。


關于生成簽名的類型"v@:"解釋一下。每一個方法會默認隱藏兩個參數(shù)皱坛,self编曼、_cmd,self代表方法調用者剩辟,_cmd代表這個方法的SEL掐场,簽名類型就是用來描述這個方法的返回值、參數(shù)的贩猎,v代表返回值為void熊户,@表示self,:表示_cmd吭服。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嚷堡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子艇棕,更是在濱河造成了極大的恐慌蝌戒,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沼琉,死亡現(xiàn)場離奇詭異北苟,居然都是意外死亡,警方通過查閱死者的電腦和手機打瘪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門粹淋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吸祟,“玉大人,你說我怎么就攤上這事桃移∥葚埃” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵借杰,是天一觀的道長过吻。 經(jīng)常有香客問我,道長蔗衡,這世上最難降的妖魔是什么纤虽? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮绞惦,結果婚禮上逼纸,老公的妹妹穿的比我還像新娘。我一直安慰自己济蝉,他們只是感情好杰刽,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著王滤,像睡著了一般贺嫂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雁乡,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天第喳,我揣著相機與錄音,去河邊找鬼踱稍。 笑死曲饱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的珠月。 我是一名探鬼主播渔工,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桥温!你這毒婦竟也來了引矩?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤侵浸,失蹤者是張志新(化名)和其女友劉穎旺韭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掏觉,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡区端,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了澳腹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片织盼。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡杨何,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沥邻,到底是詐尸還是另有隱情危虱,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布唐全,位于F島的核電站埃跷,受9級特大地震影響,放射性物質發(fā)生泄漏邮利。R本人自食惡果不足惜弥雹,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望延届。 院中可真熱鬧剪勿,春花似錦、人聲如沸方庭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽二鳄。三九已至赴涵,卻和暖如春媒怯,著一層夾襖步出監(jiān)牢的瞬間订讼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工扇苞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欺殿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓鳖敷,卻偏偏與公主長得像脖苏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子定踱,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • Objective-C 是一個動態(tài)語言棍潘,可以通過運行時系統(tǒng)來動態(tài)得創(chuàng)建類和對象、進行消息傳遞和轉發(fā)崖媚。 在Objec...
    大衛(wèi)石閱讀 244評論 0 0
  • OC具有動態(tài)語言特性亦歉,盡管OC基于C語言,這一點也是與C語言最大的區(qū)別之一畅哑。C語言在編譯的時候就決定了要調用的...
    jiangamh閱讀 707評論 2 4
  • 案例 此時有一個按鈕荠呐,就比如說是保存按鈕赛蔫,暫叫保存Button砂客。它的上面有一個子視圖,就比如說是保存進度圈呵恢,暫叫進...
    Allan_野草閱讀 1,112評論 0 6
  • Objective C語言把能在運行期做的事情就推遲到運行期再決定鞠值。這就意味著,Objective C不僅需要一個...
    小強345678閱讀 373評論 1 2
  • 以前知道蘋果執(zhí)行方法是通過消息執(zhí)行的瑰剃,當對應的對象或者類無法處理該消息時齿诉,蘋果就會啟動消息轉發(fā)機制,通過這一機制晌姚,...
    海浪萌物閱讀 442評論 0 0