load 和 initialize

load-initialize

Posted by CMB on February 21, 2017

load

load 会在类或分类被添加到 runtime 时调用。并且只会被 runtime 调用一次。

如果子类没有实现,父类的 load 方法也不会被再次调用。

load 的调用顺序

  • 链接的 framework
  • 自己的 image
  • C++ 静态初始化方法,具有 __attribute__(constructor) 修饰的函数
  • 链接到你的 image

其它:

  • 父类优先子类
  • 类优先分类( category

initialize

initialize 会在类被使用前调用。包括类方法。

比如下面的代码。在 load 内调用 [self class] 会导致 initialize 被调用。

+ (void)load
{
    NSLog(@"%@ %s", [self class], __FUNCTION__);
}

+ (void)initialize
{
    NSLog(@"%@ %s", [self class], __FUNCTION__);
}

每个类都会被 runtime 线程安全的调用一次 initialize 方法。

父类会在子类前被调用。

如果子类没有实现或者调用 [super initialize] ,则父类会被再次调用。

下面的代码可以保证只执行一次初始化操作:

+ (void)initialize {
	if (self == [ClassName self]) {
	  // ... do the initialization ...
	}
}

参考资料

1、Objective-C +load vs +initialize

2、NSObject +load and +initialize - What do they do?