之前一直觉得很复杂,今天研究了下,其实不算复杂(不要怕麻烦),记住这几点就够了:
load
load
就是类的加载,一个项目启动,项目中的所有的类就会调用load
方法,即每个类都会调用自己的load
方法,包括分类,但只会被调用一次。这里有一点不明白就是调用的顺序有什么讲究(不按添加的时间顺序,也不按字母顺序),我先记下来。
initalize
initalize
的调用则是在该类第一次被使用时,会被调用,也只会被调用一次,那么有哪些情况呢?
- 初始化一个自己的类的对象(准确说,是使用,这里是便于理解);
- 初始化一个子类(准确说,是使用,这里是便于理解),而且不管是否调用
[super init]
,只要是使用;
但是要注意,如果该类有分类,并且在分类中重写了initalize
方法,那么就只会调用分类中的initalize
方法了。
具体Demo如下图,首先,文件结构如图:
Son1
继承自Father
类,Other
继承NSObject
,整个工程,我仅初始化Son1
和Other
,一共创建3个对象。
控制台输出结果如下:
可以看到,工程中所有的类都调用了load
方法,比如没有被使用的AAA
和SSS
类,我在Son1
和Father
两个类以及这两个类的分类都重写了load
方法,都在类的加载时被调用了,当初始化一个Son1
对象时,因为Son1
继承自Father
类,所以使用到了Father
类,Father
类的initalize
方法就先被调用了,然后再是Son1
的initalize
方法被调用,但是我在Son1
的分类,也就是Son1+Extension.m
这个文件中又重写了initalize
方法,因此分类的优先级更高,只调用了Son1
的分类的initalize
方法。Other
类使用了两次,但Other
类的initalize
方法仅被调用一次。最后,因为项目没有使用AAA
和SSS
两个类,因此这两个类的initalize
方法没有被调用。