【iOS】initialize 和 load 方法

类编译后,相关的数据结构会保留在目标文件中,在运行时得到解析和使用(类的加载和初始化)。在运行期提前并且自动调用这两个方法,我们可以利用他们在类被使用前,做一些预处理工作。

initialize

在类接收第一个消息之前调用,运行环境基本健全,运行过程中是线程安全的.
父类接受这个消息在它的子类之前.
父类initialize会被调用多次:如果子类没有实现initialize,runtime会调用从父类继承的initialize;或者子类调用[super initialize]。

避免被多次调用如下:
+ (void)initialize {
if (self == [ClassName self]) {
// ... do the initialization ...
}
}

load

在类或类目被加载的时候调用
类的load调用在父类load后
类目的load调用在类本身load后

load 和 initialize 的区别

  • 在不考虑开发者主动使用的情况下,系统最多会调用一次
  • 如果父类和子类都被调用,父类的调用一定在子类之前
  • 都是为了应用运行提前创建合适的运行环境
  • 在使用时都不要过重地依赖于这两个方法,除非真正必要

load:只要类所在文件被引用就会被调用,
initialize:在类或者其子类的第一个方法被调用前调用。
所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。

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

推荐阅读更多精彩内容