iOS底层原理 11 : 消息转发机制

前言: 在慢速查找流程中,如果最后都没有找到这个imp,那么会进入动态方法决议resolveMethod_locked(),那么接下来会到哪里呢?

我们经常会看到这样一张图:


消息转发流程.jpg

那么就是这样一个流程,底层代码具体是怎样实现的呢:

在我们不知道怎么办的时候,我们可以查看堆栈。

我们看到在执行doesNotRecognizedSelector之前,执行__forwarding_prep_0______forwarding___

查看堆栈.png

那么接下我们要去寻找__forwarding_prep_0______forwarding___,我们下载CoreFoundation开源了的代码里面查找,发现找不到。

接下来通过image list指令查看所有的编译文件
我们找到CoreFoundation的编译文件路径:/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation

image list.png

接下来我们通过hopper软件对这个CoreFoundation编译文件进行反汇编

__forwarding_prep_0___.png

___forwarding___的伪代码里面,我们看到:

  • 先找forwardingTargetForSelector,
  • 如果找到forwardingTargetForSelector,消息转发
  • 如果没有找到forwardingTargetForSelector,就会找methodSignatureForSelector
  • 如果没有找到methodSignatureForSelector,直接unrecognized selector
  • 如果找到methodSignatureForSelector,会继续寻找forwardInvocation,
  • 如果没有找到forwardInvocation,直接unrecognized selector
  • 如果找到forwardInvocation,消息转发。
___forwarding___.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。