解析Objective-C 中 `+load` 方法的执行顺序
Objective-C中的+load方法在类或分类加载时自动触发,执行顺序遵循先父类后子类、先类后分类的原则。父类的+load先于子类执行,分类的+load在其所属类之后执行,但同一层级多个分类的执行顺序不确定。
理解 Objective-C 中 +load 方法的执行顺序
先说说 +load 方法:它是在类或分类被加载到内存时自动触发的一个类方法。调用时机非常早——早到程序刚启动、还没创建任何实例的时候。对于需要提前做初始化工作的场景来说,理解它的执行顺序至关重要,否则很容易埋下难以排查的坑。下面就来详细拆解一下,在类、子类和分类中,+load 到底按什么顺序跑。

+load 方法的基本介绍
+load 和 +initialize 经常被搞混,但区别很明显:+load 在类或分类加载进内存时立即执行,且只调用一次;而 +initialize 是第一次给类发消息时才触发。所以,+load 适合做“一次性静态初始化”,比如注册一些全局配置或数据结构。
类和子类中的执行顺序
当父类和子类都实现了 +load 时,规则很明确:
- 父类的
+load一定先于子类的+load执行。 - 同一继承链上的类,按编译器编译顺序依次调用。
举个例子就很清楚了:
#import@interface SuperClass : NSObject @end @implementation SuperClass + (void)load { NSLog(@"SuperClass +load"); } @end @interface SubClass : SuperClass @end @implementation SubClass + (void)load { NSLog(@"SubClass +load"); } @end int main(int argc, const char * argv[]) { @autoreleasepool { // 程序启动时自动调用 `+load` 方法 } return 0; }
运行结果:
SuperClass +load
SubClass +load
父类先跑,子类后跑,符合直觉。
分类中的执行顺序
分类的加入让事情复杂了一点点:
- 分类的
+load在它所属类的+load之后执行。 - 但同一个类如果有多个分类,这些分类之间的
+load执行顺序 —— 不确定。换句话说,不要指望分类的加载顺序有任何保障,那是运行时决定的,可能因为编译顺序、链接顺序等因素变化。
接上面代码,给 SubClass 加两个分类:
输出结果可能是:
SuperClass +load
SubClass +load
SubClass (Category1) +load
SubClass (Category2) +load
也可能是:
SuperClass +load
SubClass +load
SubClass (Category2) +load
SubClass (Category1) +load
两种都有可能,千万别依赖分类的调用顺序来写业务逻辑。
父类分类的执行顺序
如果父类也有分类实现了 +load,完整的层级顺序如下:
父类的 +load → 父类分类的 +load(顺序不定)→ 子类的 +load → 子类分类的 +load(顺序不定)。
看一个例子,给 SuperClass 加个分类:
@interface SuperClass (Category)
@end
@implementation SuperClass (Category)
+ (void)load {
NSLog(@"SuperClass (Category) +load");
}
@end
结合前面的代码,输出结果会是:
SuperClass +load
SuperClass (Category) +load
SubClass +load
SubClass (Category1) +load
SubClass (Category2) +load
可以看到,父类的分类夹在父类和子类之间,而子类分类排在最后。这个顺序是稳定的——除了同一级别分类内部的不确定性。
总结下来就一句话:+load 的执行顺序本质上遵循“先父类后子类、先类后分类”的原则,但同一层级的分支(多个分类)顺序不可控。写代码时最好让 +load 方法做到彼此独立,别互相依赖,这样既安全又省心。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















