Objc_msgSend 分析(二)

254 阅读1分钟

问题/目标分析

上文objcemsgSend分析(一)分析到了_class_lookupMethodAndLoadCache3慢速查找方法流程。本文分析_class_lookupMethodAndLoadCache3的具体实现流程。

方法分析

根据objc源码查找相关信息。

实验步骤

根据代码,编辑代码流程图

super(实例方法)方法和metaclass(isa,类型方法)方法的查找流程。

resolveMethod 为自身查找,结构方法。会调用resolveClassMethod,resolveInstanceMethod,给类型一个自己完善方法的机会。

objc_msgforward_impcache为消息转发机制,给与类型一个转发消息给其他类型的机会。
在objc_msgforward_impcache 中,如果还找不到方法,就会报错。
objc_msgforward_impcache 源码

objc_msgforward_impcache报错信息

如果在以上方法中找到了方法imp,就会加入catche,以便下次调用加速。

结果分析

慢速的方法查找流程,设计到了非catch的方法查找。会在保证类型构建完整的情况下,查找自身和superclass,metaclass相关的方法。如果找不到就forward方法,如果还找不到就报错。

总结实验

找到了objc_msgSend的慢速查找流程。
在分析方法查找的流程中,不仅能看到方法的查找流程, 也看到了类型的构建过程中系统的一些不一样的类型。如swift类型构建,不同的类型保存区域。