iOS开发 - +(void)load 和 +(void)initialize 的区别

引言:

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


I. load和initialize的共同特点


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


II. +load方法


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

总结:

在程序启动之前会调用所有的类的(手动实现的) +load 方法(没有实现就不调用咯),按(父类->子类->类别)的顺序调用.


III. +initialize方法


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

调用顺序:

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

总结:

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




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

推荐阅读更多精彩内容