消息转发的前提
在对象收到无法解读的消息时会触发消息转发
消息转发的过程
I. resolveInstanceMethod
当对象收到无法解读的消息时,会根据无法解读的消息是实例方法还是类方法分别调用+ (BOOL)resolveInstanceMethod:(SEL)selector或者+ (BOOL)resolveClassMethod:(SEL)selector方法,看这个类能不能动态新增一个方法处理这个无法解读的消息
如果这个方法返回NO就进入下一阶段的消息转发
自己无法通过新增动态方法来处理,那能不能转发给其他接收者来处理
II. forwardingTargetForSelector
通过调用对象的-(id)forwardingTargetForSelector:(SEL)selector方法看能不能将无法解读的消息转发给其他接收者处理,
如果该方法返回nil,表示没有其他的接收者可以处理这个消息
接下来会进入最后一个阶段
III. forwardInvocation
运行期系统会将那条未处理的消息的全部细节封装成一个NSInvocation对象,调用- (void)forwardInvocation:(NSInvocation *)invocation方法来转发消息,如果转发至NSObject类还不能处理,就会调用NSObject的doesNotRecognizerSelector方法,抛出异常,表明方法未能得到处理,消息转发结束。
抛出的异常是 unrecognized selector sent to instance 对象的内存地址
网友评论