美文网首页iOS高级进阶
iSO底层原理 - initialize方法

iSO底层原理 - initialize方法

作者: 南城同學 | 来源:发表于2017-08-17 09:10 被阅读0次
  • +initialize方法会在类第一次接收到消息时调用;
调用顺序:
  • 先调用父类的+initialize,再调用子类的。(先初始化父类,再初始化子类,每个类只会初始化1次。)
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的地方:
  • +initialize是通过objc_msgSend进行调用的;
  • 如果分类实现了+initialize,就覆盖类本身的+initialize调用。(找到就不再找了)
  • 如果子类没有实现+initialize,会调用父类的+initialize。(所以父类的+initialize可能会被调用多次。)

相关文章

网友评论

    本文标题:iSO底层原理 - initialize方法

    本文链接:https://www.haomeiwen.com/subject/iikgrxtx.html