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

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

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


iOS底层原理 11 : 消息转发机制_第1张图片
消息转发流程.jpg

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

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

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

iOS底层原理 11 : 消息转发机制_第2张图片
查看堆栈.png

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

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

iOS底层原理 11 : 消息转发机制_第3张图片
image list.png

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

iOS底层原理 11 : 消息转发机制_第4张图片
__forwarding_prep_0___.png

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

  • 先找forwardingTargetForSelector,
  • 如果找到forwardingTargetForSelector,消息转发
  • 如果没有找到forwardingTargetForSelector,就会找methodSignatureForSelector
  • 如果没有找到methodSignatureForSelector,直接unrecognized selector
  • 如果找到methodSignatureForSelector,会继续寻找forwardInvocation,
  • 如果没有找到forwardInvocation,直接unrecognized selector
  • 如果找到forwardInvocation,消息转发。
iOS底层原理 11 : 消息转发机制_第5张图片
___forwarding___.png

你可能感兴趣的:(iOS底层原理 11 : 消息转发机制)