iOS高级进阶

initialize方法解析

2019-08-21  本文已影响0人  南城同學
调用顺序:
void _class_initialize(Class cls)
{

    xxxxxxxxx
    //又是一个递归,如果有父类,且父类没有初始化,就先初始化父类,
    supercls = cls->superclass;
    if (supercls  &&  !supercls->isInitialized()) {
        _class_initialize(supercls);
    } 
    xxxxxxx
    callInitialize(cls);
}

void callInitialize(Class cls)
{
   //初始化时,发送一个"initialize" 方法消息。
    ((void(*)(Class, SEL))objc_msgSend)(cls, SEL_initialize);
    asm("");
}

可以抽减成如下模型:

        if (!sutdentInitialized) {
            if (!personInitialized) {
                objc_msgSend([Person class], @selector(initialize));
                personInitialized = YES;
            }

            objc_msgSend([Student class], @selector(initialize));
            sutdentInitialized = YES;
        }


+initialize方法不同于+load的地方:
上一篇下一篇

猜你喜欢

热点阅读