iOS 消息转发机制

今天大概学习了下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,常规消息转发。

第三次处理机会

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 消息转发(Message Forwarding)是在查找 IMP 失败后执行一系列转发流程的慢速通道,如果不作转发...
    二猪哥阅读 3,901评论 0 7
  •   最近看了『神奇的 BlocksKit』系列,里面说到动态代理是BlocksKit的精华部分,对于使用block...
    foreverSun_122阅读 1,167评论 1 7
  • 当我们像一个对象发送消息[Receiver message],Receiver没有实现该消息,即[Receiver...
    AlvinCrash阅读 866评论 1 5
  • 1.动态方法解析 对象在收到无法处理的消息时,会调用下面的方法,前者是调用类方法时会调用,后者是调用对象方法时会调...
    蒲公英_阅读 408评论 0 0
  • 消息转发机制 假设说我们声明一个类, 初始化对象, 并且在此类声明一个方法, 调用方法的时候底层是怎么处理的呢? ...
    软件iOS开发阅读 260评论 0 0