void _class_resolveMethod(Class cls, SEL sel, id inst)
{
if (! cls->isMetaClass()) {
// try [cls resolveInstanceMethod:sel]
_class_resolveInstanceMethod(cls, sel, inst);
}
else {
// try [nonMetaClass resolveClassMethod:sel]
// and [cls resolveInstanceMethod:sel]
_class_resolveClassMethod(cls, sel, inst);
if (!lookUpImpOrNil(cls, sel, inst,
NO/*initialize*/, YES/*cache*/, NO/*resolver*/))
{
_class_resolveInstanceMethod(cls, sel, inst);
}
}
}
objc_msgSend
------> _class_lookupMethodAndLoadCache3
------> lookUpImpOrForward
-noImp---> _class_resolveMethod
在lookUpImpOrForward中如果没有找到IMP则会调用_class_resolveMethod触发消息转发机制,但是源码中针对类方法会先调用一次_class_resolveClassMethod后如果还没有找到对应的IMP则调用一次_class_resolveInstanceMethod。
这里一点需要注意这里面的参数`cls`是元类,
答案来看下图
根源类后返回到根类查找。
这段代码就是为了上述过程而写的。