拋出異常
當一個對象調用方法是,也就是傳遞消息
的時候,在對象中找不到對應的方法。那么,如果我們在消息轉發途中沒有對這個消息進行攔截處理的話,這對象最終會調用NSObject
的doesNotRecognizeSelector:
方法來拋出異常:
[xxx xxx]: unrecognized selector send to instance 0x87..
流程
第一層
對象在收到無法解讀的消息后,首先將調用所屬類的下列類方法
:
//根據調用的對象來指向到不同的方法中
+(BOOL)resolveInstanceMethod:(SEL)sel{
//默認返回NO
}
+(BOOL)resolveClassMethod:(SEL)sel{
//默認返回NO
}
第二層
在第一層處理不了的情況下,還有第二次機會,就是更換消息接收對象(也就是更換調用的對象),注意,這個是對象方法:
//返回的對象就是備援接受者,也就是備胎,默認返回為nil
-(id)forwardingTargetForSelector:(SEL)aSelector{
}
第三層
到這里還是處理不了,就只能創建NSInvocation
,將與未處理的消息有關的細節封裝在里面(包括target,sel,paramsd等),調用:
-(void)forwardInvocation:(NSInvocation *)anInvocation{
[super ...]
}
一直往上調用,直至調用到NSObject
的該方法,而NSObject
的該方法中,調用了doesNotRecognizeSelector:
來拋出異常
流程圖.png