抛出异常
当一个对象调用方法是,也就是传递消息
的时候,在对象中找不到对应的方法。那么,如果我们在消息转发途中没有对这个消息进行拦截处理的话,这对象最终会调用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:
来抛出异常