返回
OC 中 load 和 initialize 的区别
IOS
2023-09-22 20:02:50
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 方法之前被调用。