【面试题】+initialize 相关

+ initialize 方法会在什么时候调用?

+ initialize 方法会在类第一次接收到消息时调用。

+ initialize 方法是否会被多次调用?

+ initialize 方法是通过 objc_msgSend 函数进行调用的,所以如果子类未实现 + initialize 方法,则父类会调用多次。

+ initialize 方法的调用顺序

先调用父类的 + initialize 方法,再调用子类的(先初始化父类,再初始化子类,每个类只会初始化一次)。如果分类实现了 + initialize 方法,则会覆盖类本身的 + initialize 方法。

objc4 源码分析

graph TB
subgraph objc-runtime-new.mm
    A[class_getInstanceMethod]
    B[lookUpImpOrForward]
    C[realizeAndInitializeIfNeeded_locked]
    D[initializeAndLeaveLocked]
    E[initializeAndMaybeRelock]
end
subgraph objc-initialize.mm
    F[initializeNonMetaClass]
    G[callInitialize]
    H("((void(*)(Class, SEL))objc_msgSend)(cls, @selector(initialize));")
end

A-->B
B-->C
C-->D
D-->E
E-->F
F-->G
F-->|"supercls = cls->getSuperclass();<br>if (supercls && !supercls->isInitialized())"|F
G-->H