问题/目标分析
接上文objcemsgSend分析(一)分析到了_class_lookupMethodAndLoadCache3慢速查找方法流程。本文分析_class_lookupMethodAndLoadCache3的具体实现流程。
方法分析
根据objc源码查找相关信息。
实验步骤
根据代码,编辑代码流程图
resolveMethod 为自身查找,结构方法。会调用resolveClassMethod,resolveInstanceMethod,给类型一个自己完善方法的机会。
objc_msgforward_impcache为消息转发机制,给与类型一个转发消息给其他类型的机会。
在objc_msgforward_impcache 中,如果还找不到方法,就会报错。
objc_msgforward_impcache 源码
如果在以上方法中找到了方法imp,就会加入catche,以便下次调用加速。
结果分析
慢速的方法查找流程,设计到了非catch的方法查找。会在保证类型构建完整的情况下,查找自身和superclass,metaclass相关的方法。如果找不到就forward方法,如果还找不到就报错。
总结实验
找到了objc_msgSend的慢速查找流程。
在分析方法查找的流程中,不仅能看到方法的查找流程, 也看到了类型的构建过程中系统的一些不一样的类型。如swift类型构建,不同的类型保存区域。