上图为将所有在+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方法又会被执行一遍.
危害二:
如果子类的+load方法调用了super.
同时父类又实现了+initialize方法.
那么会提前触发父类的initialize方法被调用.
场景二:+ initialize被多次调用
initialize会被多次调用见如图.
他会在每个子类第一次创建的时候递归再次调用父类的+initialize方法.
场景三: +initialize的触发条件
+initialize方法只会在第一次向这个类发送消息的时候才会被调用.
所以这个方法可能永远都不会被调用.
但并不是只有alloc这样的消息才会触发.类似以下的消息也会触发
1.[XXClass class]这样的消息也会触发initialize方法
2.在load方法里NSLog(@“%@“,self);也会触发initialize方法.
3.在子类的load方法里调用[super load]也会触发initialize方法 (所以千万不要在load方法里调用super.可能会产生莫名其妙的问题)
网友评论