(杂记)iOS底层---为什么_resolveMethod中类方法实现两次调用

784 阅读1分钟
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`是元类,

答案来看下图

方法查找会在查找到根源类后返回到根类查找。

这段代码就是为了上述过程而写的。