對象收到無法解讀的消息時贝室,就會啟動消息轉(zhuǎn)發(fā)機制
第一個階段:動態(tài)方法解析偎肃。
1. 對象在收到無法解讀的消息后千扶,首先將調(diào)用其所屬類下面這個類方法
+(BOOL) resolveInstanceMethod:(SEL)selector; //參數(shù)名為那個未知的選擇子
也就是再繼續(xù)往下執(zhí)行轉(zhuǎn)發(fā)機制之前勉抓,本類有機會新增一個處理這個選擇子的方法骇吭。
如果選擇子的方法是個類方法,則使用
+(BOOL) resolveClassMethod:(SEL)selector岩睁。
2.備援接收著
接收者第二次處理無法解讀消息的機會钞脂,將消息轉(zhuǎn)給其他接收者來處理
-(id)forwardingTargetForSelector:(SEL)selector
第二個階段:完整的消息轉(zhuǎn)發(fā)。
到了這個一步就要啟動完整消息轉(zhuǎn)發(fā)機制捕儒,首先要創(chuàng)建NSInvocation,把尚未處理的消息的全部細(xì)節(jié)放進去冰啃,觸發(fā)NSInvocation時,通過消息派發(fā)系統(tǒng)刘莹,將消息指派給目標(biāo)對象亿笤。
-(void)forwardInvocation:(NSInvocation *)invocation
跟備援接收者 方案所實現(xiàn)的方法等效。實現(xiàn)方法時栋猖,若發(fā)現(xiàn)某調(diào)用操作不應(yīng)由本類處理,則需要調(diào)用超類的同名方法汪榔。所以繼承體系中每個類都有機會處理此調(diào)用請求。直到NSObject, 最后還會調(diào)用
doesNotRecognizeSelector: ?以拋出異常贫奠。表明消息最終沒有被處理芬沉。