OC中的initialize

2020-07-16  本文已影响0人  it小小菜鸟
  1. +initialize方法会在类第一次接收到消息时调用
  2. +initialize是通过消息机制来调用的,所以分类中initialize会调用,而类的initialize就不会调用了
  3. +initialize会先调用父类的+initialize,再调用子类的+initialize方法。(分析源码得到)
  4. 如果子类没有实现+initialize,就会调用父类的+initialize(所以父类的+initialize可能会被调用多次)

通过消息机制,发送消息时。会去查找方法列表,在查找方法列表的过程中会调用class_getInstanceMethod方法,该方法中会调用lookUpImpOrNil方法,在该方法中,会调用initializeAndLeaveLocked,该方法中又调用initializeAndMaybeRelock,该方法中调用initializeNonMetaClass,该方法中会递归调用,并传入父类,然后调用callInitialize(cls),在callInitialize()中会调用objc_msgSend(cls, @selector(initialize)方法给对象发送消息

void initializeNonMetaClass(Class cls)
{
    ASSERT(!cls->isMetaClass());

    Class supercls;
    bool reallyInitialize = NO;

    // Make sure super is done initializing BEFORE beginning to initialize cls.
    // See note about deadlock above.
    // 如果父类没有初始化,就会先调用父类的初始化方法
    supercls = cls->superclass;
    if (supercls  &&  !supercls->isInitialized()) {
        initializeNonMetaClass(supercls);
    }
...
 callInitialize(cls);
void callInitialize(Class cls)
{
    ((void(*)(Class, SEL))objc_msgSend)(cls, @selector(initialize));
    asm("");
}
上一篇 下一篇

猜你喜欢

热点阅读