Objective-C消息转发流程

抛出异常

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

[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:来抛出异常

Objective-C消息转发流程_第1张图片
流程图.png

你可能感兴趣的:(Objective-C消息转发流程)