Runtime objc4-779.1 一图看懂iOS Runtime消息转发

Posted Jsen_Wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Runtime objc4-779.1 一图看懂iOS Runtime消息转发相关的知识,希望对你有一定的参考价值。

消息发送流程图

设定消息接受者为receiver
图是用markdown画的,适配可能有点问题,浏览器页面放大看好一些

Created with Raphaël 2.2.0 开始 objc_msgSend(receiver, SEL) 通过receiver,获取isa指针,并获取其class 在class的cache中查找SEL是否存在? 匹配Method,执行IMP 结束 在class的method_list中查找SEL是否存在? 在去父类中查找SEL是否存在? 当前类为NSObject,SEL是否存在? resolveInstanceMethod or resolveClassMethod forwardingTargetForSelector 返回其他接收者? 重新发送消息给新的接收者 methodSignatureForSelector是否返回方法签名? forwardInvocation unrecognized selector sent to instance yes no yes no yes no yes no yes no yes no yes no

这个过程很多博文都介绍过,在此不再累赘.我们只提炼出里边需要我们注意的内容即可.

总结一下

  • 1,方法的调用都是通过objc_msgSend(receiver,SEL...)做到的,OC的方法中有两个默认值,self, _cmd
  • 2,方法在类中查找的过程中会优先去cache中,然后再去method_list查找,如果都没有,沿着继承链,递归查找
  • 3,如果在继承链上没有找到,那么就进入消息转发过程
  • 4,如果找到了,方法会被记录到cache中,方便下次查找
  • 5,其实在查找方法的过程中,Runtime还做了各种异常处理,比如class不存在,class没有初始化等等

以上是关于Runtime objc4-779.1 一图看懂iOS Runtime消息转发的主要内容,如果未能解决你的问题,请参考以下文章

Runtime objc4-779.1 通过runtime源码对OC对象销毁过程解析

Runtime objc4-779.1 App启动过程中Runtime都干了什么?

Runtime objc4-779.1 通过runtime源码对OC对象初始化过程解析

Runtime objc4-779.1 App启动过程中Runtime都干了什么?

Runtime objc4-779.1 OC中,为什么swizzleMethod时要先addMethod?

Runtime objc4-779.1 Runtime在实际开发中的应用之__attribute__