前言: 在慢速查找流程中,如果最后都没有找到这个imp,那么会进入动态方法决议resolveMethod_locked(),那么接下来会到哪里呢?
我们经常会看到这样一张图:
消息转发流程.jpg
那么就是这样一个流程,底层代码具体是怎样实现的呢:
在我们不知道怎么办的时候,我们可以查看堆栈。
我们看到在执行doesNotRecognizedSelector
之前,执行__forwarding_prep_0___
和___forwarding___
。
那么接下我们要去寻找
__forwarding_prep_0___
和___forwarding___
,我们下载CoreFoundation开源了的代码里面查找,发现找不到。
接下来通过image list
指令查看所有的编译文件
我们找到CoreFoundation的编译文件
路径:/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
接下来我们通过hopper
软件对这个CoreFoundation编译文件
进行反汇编
在
___forwarding___
的伪代码里面,我们看到:
- 先找forwardingTargetForSelector,
- 如果找到forwardingTargetForSelector,消息转发
- 如果没有找到forwardingTargetForSelector,就会找methodSignatureForSelector
- 如果没有找到methodSignatureForSelector,直接unrecognized selector
- 如果找到methodSignatureForSelector,会继续寻找forwardInvocation,
- 如果没有找到forwardInvocation,直接unrecognized selector
- 如果找到forwardInvocation,消息转发。
网友评论