一、消息转发流程
1.查看方法未实现的时候调用的log
在路径 /tmp/ 下可以看到msgSends-XXX的文本
如果msgSends-XXX文件没有内容的话,注释掉logMessageSend函数中的objcMsgLogLock.lock()和objcMsgLogLock.unlock()
2.整体流程
resolveInstanceMethod->forwardingTargetForSelector->methodSignatureForSelector和forwardInvocation
resolveInstanceMethod 给自己一次实现的机会
forwardingTargetForSelector 可以转发到别的类
methodSignatureForSelector和forwardInvocation 最后一次机会去处理
二、动态决议方法走两遍
现象:resolveInstanceMethod走了两次
首先在resolveInstanceMethod函数打断点
然后再第二次进入的时候打印
可以看到第二次是由lookUpImpOrNilTryCache发起的
通过源码可以找到调用链:lookUpImpOrForward(6495行)->resolveMethod_locked->resolveInstanceMethod->lookUpImpOrNilTryCache->_lookUpImpTryCache->lookUpImpOrForward
通过打印:resolveInstanceMethod->forwardingTargetForSelector->methodSignatureForSelector->resolveInstanceMethod
所以为什么这么设计呢?我特么也不知道。。。哈哈哈。。。
三、整体的流程图
1.查找缓存
2.查找方法列表
3.消息转发