理解 Objective-C 中 `+load` 方法的执行顺序

理解 Objective-C 中 +load 方法的执行顺序

在 Objective-C 中,+load 方法是在类或分类被加载到内存时调用的。它在程序启动过程中非常早的阶段执行,用于在类或分类被加载时进行一些初始化工作。理解 +load 方法的执行顺序对于编写可靠的 Objective-C 代码非常重要。本文将详细探讨 +load 方法在类、子类和分类中的执行顺序。

+load 方法的基本介绍

+load 方法是一个类方法,在类或分类被加载时自动调用。与 +initialize 方法不同,+load 方法只会被调用一次,并且在加载类和分类时立即执行,而不等待任何实例的创建。

类和子类中的执行顺序

当一个类和它的子类都实现了 +load 方法时,执行顺序如下:

  1. 父类的 +load 方法 先于 子类的 +load 方法 执行。
  2. 在同一个继承层次结构中,类的 +load 方法按照编译顺序执行。

例如,考虑以下代码:

objective-c 复制代码
#import <Foundation/Foundation.h>

@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 方法的执行顺序稍微复杂一些:

  1. 分类的 +load 方法 在其所属类的 +load 方法之后执行。
  2. 如果一个类有多个分类,那么分类的 +load 方法的执行顺序是不确定的。这意味着我们不应该依赖于分类的加载顺序来编写代码。

考虑以下示例:

objective-c 复制代码
@interface SubClass (Category1)
@end

@implementation SubClass (Category1)
+ (void)load {
    NSLog(@"SubClass (Category1) +load");
}
@end

@interface SubClass (Category2)
@end

@implementation SubClass (Category2)
+ (void)load {
    NSLog(@"SubClass (Category2) +load");
}
@end

在上述代码的基础上,输出结果可能是:

复制代码
SuperClass +load
SubClass +load
SubClass (Category1) +load
SubClass (Category2) +load

或:

复制代码
SuperClass +load
SubClass +load
SubClass (Category2) +load
SubClass (Category1) +load

父类分类的执行顺序

如果父类的分类也实现了 +load 方法,执行顺序如下:

  1. 父类的 +load 方法
  2. 父类分类的 +load 方法(按任意顺序)。
  3. 子类的 +load 方法
  4. 子类分类的 +load 方法(按任意顺序)。

考虑以下示例代码:

objective-c 复制代码
@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
相关推荐
搜狐技术产品小编20234 小时前
CAEmitterLayer:iOS 中创建炫酷粒子效果的魔法工具
macos·ios·objective-c·cocoa
未来之窗软件服务20 小时前
操作系统应用开发(七)mac苹果模拟器——东方仙盟练气期
macos·仙盟创梦ide·东方仙盟·系统模拟器
liliangcsdn20 小时前
Mac本地docker安装Kibana+ElasticSearch
elasticsearch·macos·docker
千寻简20 小时前
远程连接Mac操作ClaudeCode一直提示登录Invalid API key · Please run /login
macos
小朋友,你是否有很多问号?20 小时前
Mac安装hadoop
hadoop·macos
00后程序员张1 天前
iOS App 混淆与资源保护:iOS配置文件加密、ipa文件安全、代码与多媒体资源防护全流程指南
android·安全·ios·小程序·uni-app·cocoa·iphone
咕噜签名分发冰淇淋1 天前
内测分发是什么?
ios
2501_916007471 天前
Transporter App 使用全流程详解:iOS 应用 ipa 上传工具、 uni-app 应用发布指南
android·ios·小程序·https·uni-app·iphone·webview
脚踏实地的大梦想家1 天前
【Docker】P2 Docker环境构建准备:MacOS 与 Linux
linux·macos·docker
白玉cfc1 天前
【OC】单例模式
开发语言·ios·单例模式·objective-c