返回

OC 中 load 和 initialize 的区别

IOS

OC 中 load 和 initialize 的区别

OC 文件在编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用。在应用程序运行起来的时候,类的信息会有加载和初始化过程,这个过程就涉及到了类的两个类方法:load 和 initialize。下面我们就来介绍一下这 2 个方法的区别。

1. 调用时机

  • load: 在类或其子类第一次接受到消息时调用。
  • initialize: 在类第一次创建实例时调用。

2. 作用

  • load: 主要是进行一些静态初始化工作,比如加载资源、注册类信息等。
  • initialize: 主要是进行一些动态初始化工作,比如分配内存、初始化成员变量等。

3. 调用顺序

  • 对于一个类,它的 load 方法会在其父类的 load 方法之后调用。
  • 对于一个类,它的 initialize 方法会在其父类的 initialize 方法之后调用。

4. 是否可以重写

  • load: 不可以重写。
  • initialize: 可以重写。

5. 使用场景

  • load: 一般用于加载一些公共资源,比如图片、声音等。
  • initialize: 一般用于初始化一些实例变量,比如单例对象的创建等。

注意

  • load 和 initialize 方法都是类方法,因此不能在实例方法中调用。
  • load 和 initialize 方法的实现不能包含任何会产生副作用的代码,比如 I/O 操作或网络请求。

下面通过一个例子来说明 load 和 initialize 的使用:

@interface Person : NSObject
{
    NSString *_name;
}

+ (void)load
{
    NSLog(@"Person load");
}

+ (void)initialize
{
    NSLog(@"Person initialize");
}

- (instancetype)initWithName:(NSString *)name
{
    if (self = [super init]) {
        _name = name;
    }
    return self;
}

- (void)sayHello
{
    NSLog(@"Hello, my name is %@.", _name);
}

@end

int main()
{
    [Person sayHello];
    return 0;
}

在这个例子中,Person 类的 load 方法在 main 函数中调用 [Person sayHello] 时被调用,而 initialize 方法在创建 Person 实例时被调用。输出结果如下:

Person load
Person initialize
Hello, my name is (null).

从输出结果可以看出,load 方法在 initialize 方法之前被调用。