iSO底层原理 - initialize方法

南城同學IP属地: 浙江
0.18字数 154阅读 243
  • +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可能会被调用多次。)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
2人点赞
更多精彩内容,就在简书APP
"小礼物走一走,来简书关注我"
还没有人赞赏,支持一下
南城同學<a href="https://github.com/YZQ-Nine" rel="nofo...
总资产9共写了4.5W字获得194个赞共48个粉丝

推荐阅读更多精彩内容