在iOS开发中,就像Application有生命周期回调方法一样,在Objective-C的类被加载和初始化的时候,也可以收到方法回调,可以在适当的情况下做一些定制处理。而这正是本篇文章所要介绍的
-(void)init
和+(void)initialize
方法可以帮我们做到的。
load和initialize的共同特点
load
和 initialize
有很多共同特点,下面简单列一下:
- 在不考虑开发者主动使用的情况下, 两个方法系统最多会调用一次
- 如果父类和子类都被调用,父类的调用一定在子类之前
- 都是为了应用运行提前创建合适的运行环境
- 在使用时都不要过重地依赖于这两个方法,除非真正必要
+load方法
- 调用时机比较早,运行环境有不确定因素。通常都是 App 启动前进行调用,当 load 调用的时候,并不能保证所有类都加载完成且可用,必要时还要自己负责做
auto release
处理. - load类所在文件被引用就会调用, 如果没有被引用到项目中, 就不会调用.
*如果子类没有实现该方法, 该子类不会是不会调用该方法的, 就算父类实现了也不会调用父类的load方法。 - 如果子类实现了, 父类的 load 方法会优先于子类调用,类别的 load 方法一般最后调用不会直接触发 initialize 的调用。
通俗的讲:
在程序启动之前会调用所有的类的(手动实现的) +load 方法(没有实现就不调用咯),按(父类->子类->类别)的顺序调用.
+initialize方法
- initialize 的自然调用是在第一次主动使用当前类或者子类时,在第一个方法(alloc)被调用前调用。
- 在 initialize 方法被调用时,应用的运行环境基本健全。
- initialize 的运行过程中是能保证线程安全的。
- 和 load 不同,如果子类不实现 initialize 方法,会把父类的实现继承过来调用一遍。注意的是在此之前,父类的方法已经被执行过一次了,同样不需要 super 调用。
通俗的讲:
在程序启动之后,在第一次创建这个类的对象的时候(也就是分配内存空间alloc的时候),会调用该类的 +initialize 方法且只调用一次.
调用顺序:
1.如果父类的 initialize 方法没有被调用过会先调用父类的 initialize 方法)
2.如果该类有类别只会调用类别的 +initialize
(如果有多个类别会调用某一个类别的 initialize 方法,其他的不会调用)]
由于 initialize 的这些特点,使得其应用比 load 要略微广泛一些。可用来做一些初始化工作,或者单例模式的一种实现方案。
官方文档
Apple的官方文档很清楚地说明了 initialize 和 load 的区别在于:
load 是只要类所在文件被引用就会被调用,而 initialize 是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有 load 调用;但即使类文件被引用进来,但是没有使用,那么 initialize 也不会被调用。
网友评论