+load 和 +initialize

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 ...
    }
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容