+(void)load和+(void)initialize的区别

引言:

官方文档给出的区别:

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


# 一. load和initialize的共同特点

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

# 二. +load方法

  • 调用时机比较早,运行环境有不确定因素。通常都是 App 启动前进行调用,当 load 调用的时候,并不能保证所有类都加载完成且可用,必要时还要自己负责做auto release处理;
  • load类所在文件被引用就会调用, 如果没有被引用到项目中, 就不会调用;
  • 如果子类没有实现该方法, 该子类不会是不会调用该方法的, 就算父类实现了也不会调用父类的load方法;
  • 如果子类实现了, 父类的 load 方法会优先于子类调用,类别的load方法一般最后调用不会直接触发initialize的调用;

总结:

在程序启动之前会调用所有的类的(手动实现的) +load 方法(没有实现就不调用咯),

按(父类->子类->类别)的顺序调用.


# 三. +initialize方法

  • initialize 的自然调用是在第一次主动使用当前类或者子类时,在第一个方法(alloc)被调用前调用 ;
  • initialize 方法被调用时,应用的运行环境基本健全 ;
  • initialize 的运行过程中是能保证线程安全的 ;
  • 和 load 不同,如果子类不实现 initialize 方法,会把父类的实现继承过来调用一遍。注意的是在此之前,父类的方法已经被执行过一次了,同样不需要super 调用 ;

# 1. 调用顺序:

  • 如果父类的 initialize 方法没有被调用过会先调用父类的 initialize 方法 ;
  • 如果该类有类别只会调用类别的 +initialize (如果有多个类别会调用某一个类别的 initialize 方法,其他的不会调用);

总结:

在程序启动之后,在第一次创建这个类的对象的时候(也就是分配内存空间alloc的时候),会调用该类的+initialize 方法且只调用一次 ;