+initialize & +load方法

image.png

上图为将所有在+load方法里的代码转移到+initialize方法里后的对比图.

前言

大家都知道+load方法是在main函数之前被执行的.
大量重写+load方法会增加APP启动时间.

所以很多建议都是将在+load方法里执行的事件转移到+initialize
方法里.

这里就讲一下这两个方法的差异

一.异

+load方法在程序刚启动时就必定会被执行
+initialize是在第一次向该类发送消息的时候被执行

+load方法不会被分类覆写
+initialize方法会被分类覆写 (即本类的+initialize方法永远不会被调用了)

被子类覆写时.父类的+load和+initialize都是会被调用的.因为子类可能会调用super
不同点在于:
不管子类有没有调用super.父类的+load方法都会被调用.
如果子类的+initialize方法没有调用super.那么父类的+initialize就不会被调用.

二.同

+load和+initialize都可能会被调用多次
见场景一/二.

三.总结

重写+load方法时千万不要调用super. (见场景一)
危害一: 可能会导致父类的+load方法被重复执行
危害二: 会导致+initialize方法被调用

重写+initialize方法时也最好不要调用super.(见场景二)

场景一: +load

危害一:

如果父类实现了+load方法.
那么子类调用[super load];时.父类的load方法又会被执行一遍.

image.png

危害二:

如果子类的+load方法调用了super.
同时父类又实现了+initialize方法.
那么会提前触发父类的initialize方法被调用.

image.png

场景二:+ initialize被多次调用

initialize会被多次调用见如图.
他会在每个子类第一次创建的时候递归再次调用父类的+initialize方法.

image.png

场景三: +initialize的触发条件

+initialize方法只会在第一次向这个类发送消息的时候才会被调用.
所以这个方法可能永远都不会被调用.

但并不是只有alloc这样的消息才会触发.类似以下的消息也会触发

1.[XXClass class]这样的消息也会触发initialize方法
2.在load方法里NSLog(@“%@“,self);也会触发initialize方法.
3.在子类的load方法里调用[super load]也会触发initialize方法 (所以千万不要在load方法里调用super.可能会产生莫名其妙的问题)

推荐阅读更多精彩内容