? ? ? 當一個對象收到無法解讀的消息后會如何處理,也就是說對象無法響應選擇子(方法),這時就要進入到消息轉發機制的流程。
? ? ? 我們經過會在程序崩潰的時候看到這樣的提示:**** unrecognized selector sent to instance 表明你曾向某個對象發送了一條無法解讀的消息。
? ? ? 下面將簡述一下消息轉發機制的流程。
? ? ? 1.查找接收者所屬的類,看其是否能動態添加方法,以處理這個“未知的方法”。(動態方法解析)
? ? ? +(BOOL) resolveInstanceMethod:(SEL)selector
? ? ? 2.運行期系統把消息轉給其他接收者處理。(備援接收者)
? ? ? -(id)forwardingTargetForSelector:(SEL)selector
? ? ? 3.經過上述兩步后,如果還是沒有辦法處理選擇子,就啟動完成的消息轉發。創建NSInvocation對象,把與尚未處理的那條消息有關的全部細節都封于其中。此對象包含選擇子、目標target及參數。在觸發NSInvocation對象時,消息派發系統會把消息指派給目標對象。
? ? ? ?-(void)forwardInvocation:(NSInvocation *)invocation
tips:接收者在每一步都有機會處理消息。步驟越往后,處理消息的代價越大。