11.消息转发

230 阅读1分钟

一、消息转发流程

1.查看方法未实现的时候调用的log

image.png 在路径 /tmp/ 下可以看到msgSends-XXX的文本 image.png 如果msgSends-XXX文件没有内容的话,注释掉logMessageSend函数中的objcMsgLogLock.lock()和objcMsgLogLock.unlock() image.png

2.整体流程

resolveInstanceMethod->forwardingTargetForSelector->methodSignatureForSelector和forwardInvocation image.png resolveInstanceMethod 给自己一次实现的机会

forwardingTargetForSelector 可以转发到别的类

methodSignatureForSelector和forwardInvocation 最后一次机会去处理

二、动态决议方法走两遍

现象:resolveInstanceMethod走了两次 image.png 首先在resolveInstanceMethod函数打断点 image.png 然后再第二次进入的时候打印 image.png 可以看到第二次是由lookUpImpOrNilTryCache发起的

通过源码可以找到调用链:lookUpImpOrForward(6495行)->resolveMethod_locked->resolveInstanceMethod->lookUpImpOrNilTryCache->_lookUpImpTryCache->lookUpImpOrForward

通过打印:resolveInstanceMethod->forwardingTargetForSelector->methodSignatureForSelector->resolveInstanceMethod image.png

所以为什么这么设计呢?我特么也不知道。。。哈哈哈。。。

三、整体的流程图

1.查找缓存

2.查找方法列表

3.消息转发 image.png