今天大概学习了下iOS的消息转发机制,还是挺有收获,在此做下笔记,以便后面温习。
1.iOS的消息转发机制原理如下图
从全局来看,消息转发机制共分为3大步骤:
1).Method resolution 方法解析处理阶段
2).Fast forwarding 快速转发阶段
3).Normal forwarding 常规转发阶段
那么如果想要不抛出unrecognized selector 的报错,也就需要从这3步里面来做补救了,我们一步一步来看如何在这3个阶段来进行补救。
2.消息的转发拦截
iOS 方法调用的实质是调用objc_msgsend(id self, SEL op, ...)方法,objc_msgsend()方法会去class里面的方法列表去查找相应的方法(一般会先去class的方法缓存去查找,如果缓存查不到,则会去方法列表查找)。如果在class或者class的继承链中没有找到对应的方法,那么就会触发消息转发。如果不做任何处理,在代码运行的时候会崩溃,出现方法未定义的错误提示。
3.+ (BOOL)resolveInstanceMethod:(SEL)sel,方法解析处理阶段
这是苹果给开发者第一次处理未定义消息的机会。在这个方法里面可以利用runtime机制添加方法,当对象在class方法列表里面没有找到对应的方法后,就会执行这个方法里面的代码。
4.如果+ (BOOL)resolveInstanceMethod:(SEL)sel返回NO,或者未做任何处理。这时会来到- (id)forwardingTargetForSelector:(SEL)aSelector,快速转发阶段。这个方法是消息接受找一个替代者,由替代者去执行传过来的方法。
5.如果上面两步都没有做任何处理,那么还有第三次机会,可以对消息进行处理。- (void)forwardInvocation:(NSInvocation*)anInvocation,常规消息转发。
如果这三步都没有做任何处理,那么运行程序会导致崩溃发生,提示方法未定义!!!