美文网首页
iOS 消息转发机制

iOS 消息转发机制

作者: 想不出一个 | 来源:发表于2019-10-18 10:31 被阅读0次

    今天大概学习了下iOS的消息转发机制,还是挺有收获,在此做下笔记,以便后面温习。

    1.iOS的消息转发机制原理如下图

    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,常规消息转发。

    第三次处理机会

    如果这三步都没有做任何处理,那么运行程序会导致崩溃发生,提示方法未定义!!!

    相关文章

      网友评论

          本文标题:iOS 消息转发机制

          本文链接:https://www.haomeiwen.com/subject/zqcoectx.html