iOS之OC的initialize分析

准备代码

@implementation LGPerson

+(void)load
{
    NSLog(@"%s",__func__);
}

+ (void)initialize{
    NSLog(@"%s",__func__);
}

@end

@implementation LGPerson (LG)

+(void)load
{
    NSLog(@"%s",__func__);
}

+ (void)initialize{
    NSLog(@"%s",__func__);
}

@end

@implementation LGPerson (KC)

+(void)load
{
    NSLog(@"%s",__func__);
}

+ (void)initialize{
    NSLog(@"%s",__func__);
}

@end
image.png

从上图分析出进入main函数,initialize并没有执行。

image.png

从上图中分析出,点击下向下执行,initialize执行了。

image.png

调用class方法initialize也执行了。initialize和调用某个方法没关系。
调用方法本质是objc_msgSend。objc_msgSend里面没有initialize方法。那就只有在lookUpImpOrForward方法里面。

initialize只调用某个类中的方法一次,和普通方法是一样的。
和Build Phases 中的Compiles Resouces类的编译循序有关系有关系。

initialize的调用流程。

lookUpImpOrForward中的方法

 if (initialize && !cls->isInitialized()) {
        cls = initializeAndLeaveLocked(cls, inst, runtimeLock);
        // runtimeLock may have been dropped but is now locked again

        // If sel == initialize, class_initialize will send +initialize and 
        // then the messenger will send +initialize again after this 
        // procedure finishes. Of course, if this is not being called 
        // from the messenger then it won't happen. 2778172
    }

// Locking: caller must hold runtimeLock; this may drop and re-acquire it
static Class initializeAndLeaveLocked(Class cls, id obj, mutex_t& lock)
{
    return initializeAndMaybeRelock(cls, obj, lock, true);
}


    // runtimeLock is now unlocked, for +initialize dispatch
    assert(nonmeta->isRealized());
    initializeNonMetaClass(nonmeta);

#if __OBJC2__
        @try
#endif
        {
            callInitialize(cls);

void callInitialize(Class cls)
{
    ((void(*)(Class, SEL))objc_msgSend)(cls, SEL_initialize);
    asm("");
}

从上可以分析出最终到objc_msgSend消息发送完毕。

你可能感兴趣的:(iOS之OC的initialize分析)