今天我们来谈一下IOS中老生常谈的load方法和initialize方法,首先来说一下为什么总会把这两个方法做比较。这就要从IOS的优化说起,IOS的优化又要从IOS的启动说起也就是我们常说的冷启动优化,冷启动优化大概有两个阶段 已main函数为界限分为main函数之前和main函数之后,而load方法是main函数之前的,而initialize方法是main函数之后到launchdidFinish方法的。下面我们来说一下这两个方法的特性。
1.load 方法
至于load方法的底层有一篇文章已经分析的很透彻了我们就暂时不做研究主要说一下load函数的执行特性。 load方法是在main函数之前执行的也就是在运行时候也就是程序的类文件被装载的时候调用的。 通常我们会在这里用Runtime的一些API 来控制我们的代码。值得注意的是 load的方法执行顺序大概是 父类>>子类>> Category。 并且如果子类没有实现load方法的话父类的load方法也不会被调用。
2.initialize方法
initialize方法是在第一次调用该类的方法的时候调用,但是这个方法有一个特点,就是就算子类没有实现initialize方法 父类的initialize方法也会被调用。这个方法通常用作优化APP的一些代码
main()函数执行前:
减少动态库数量,可以合并动态库
减少无用的方法和类,合并分类
减少 在load方法,试着用Initialize替代
减少atribute((constructor))的使用,控制全局变量数量
main()函数之后:
对业务进行模块化处理,非首屏渲染业务应当尽量放到首屏渲染之后处理。
1.当类和类Category中load方法都存在时,先调用类中load方法,Category中load方法后调用(注意:Category中load晚于所有的类中load方法调用)
2.父类load方法优先于子类load方法(参考人类子类:XMMan和人类:XMPeople)
3.子类没实现load方法,不会调用父类load方法(参考人类子类:XMWoman)
4.Category的load调用顺序,与对应类之间的关系无关,与编译顺序一致(参考XMPeople(Category1)、XMPeople(Category2)、 XMMan(Category1)、XMMan(Category2))
5.类与类的Category中的load方法都会调用6.当有多个类时,load调用顺序和类文件编译顺序有关(参考动物类:XMAnimal和人类:XMPeople)
1.如果类和类Category都实现了initialize方法,调用Category的initialize方法,会覆盖类中的方法,只执行一个,如果多个category,则调用编译顺序最后的initialize方法。(测试1)
2.如果父类和子类都实现了initialize方法,在调用子类时,如果父类的initialize方法调用过,则只调用子类initialize方法,如果父类没用过,则先调用父类的Category的initialize方法,在调用子类的initialize方法(测试2)。如果调用子类的时候,已经初始化过父类的initialize,则在初始化父类的时候,不会再调用initialize方法(测试3)
3.如果子类没有实现initialize方法,父类实现了initialize方法,调用子类的时候,会先调用父类的initialize方法,再调用子类的实例方法。(测试4)