iOS load和initalize

之前一直觉得很复杂,今天研究了下,其实不算复杂(不要怕麻烦),记住这几点就够了:

load

load就是类的加载,一个项目启动,项目中的所有的类就会调用load方法,即每个类都会调用自己的load方法,包括分类,但只会被调用一次。这里有一点不明白就是调用的顺序有什么讲究(不按添加的时间顺序,也不按字母顺序),我先记下来。

initalize

initalize的调用则是在该类第一次被使用时,会被调用,也只会被调用一次,那么有哪些情况呢?

  • 初始化一个自己的类的对象(准确说,是使用,这里是便于理解);
  • 初始化一个子类(准确说,是使用,这里是便于理解),而且不管是否调用[super init],只要是使用
    但是要注意,如果该类有分类,并且在分类中重写了initalize方法,那么就只会调用分类中的initalize方法了。

具体Demo如下图,首先,文件结构如图:

iOS load和initalize_第1张图片
所有文件.png

Son1继承自Father类,Other继承NSObject,整个工程,我仅初始化Son1Other,一共创建3个对象。

iOS load和initalize_第2张图片

控制台输出结果如下:

iOS load和initalize_第3张图片
调用顺序.png

可以看到,工程中所有的类都调用了load方法,比如没有被使用的AAASSS类,我在Son1Father两个类以及这两个类的分类都重写了load方法,都在类的加载时被调用了,当初始化一个Son1对象时,因为Son1继承自Father类,所以使用到了Father类,Father类的initalize方法就先被调用了,然后再是Son1initalize方法被调用,但是我在Son1的分类,也就是Son1+Extension.m这个文件中又重写了initalize方法,因此分类的优先级更高,只调用了Son1的分类的initalize方法。Other类使用了两次,但Other类的initalize方法仅被调用一次。最后,因为项目没有使用AAASSS两个类,因此这两个类的initalize方法没有被调用。

你可能感兴趣的:(iOS load和initalize)