OC load 和 initialize 有什么区别
1. 触发时机
+load方法- 当类或其分类(category)被加载到内存时,系统会立即调用
+load方法。 +load会在应用启动时自动运行,不需要显式调用父类的+load。- 每个类及其分类的
+load都会依次执行,顺序如下:- 先执行主类的
+load方法。 - 然后按编译顺序依次执行分类的
+load方法。
- 先执行主类的
- 因为
+load在加载类时调用,所以在其执行时,应用的其他部分可能尚未初始化。
- 当类或其分类(category)被加载到内存时,系统会立即调用
+initialize方法- 当类第一次收到消息并执行任何方法之前,系统会调用
+initialize方法。 - 不同于
+load,+initialize只有在类第一次被使用时才会触发。如果类从未被使用,+initialize也不会被调用。 - 如果类继承了
+initialize,系统会自动调用父类的+initialize方法。因此,每个类的+initialize只会在必要时执行一次。
- 当类第一次收到消息并执行任何方法之前,系统会调用
2. 主要用途
+load方法+load通常用于在应用启动时进行一些必要的全局配置,如方法交换(method swizzling)或初始化全局变量。- 因为
+load在应用启动时立即执行,适合用来设置需要在应用生命周期早期配置的内容。
+initialize方法+initialize主要用于类的懒加载,即在类第一次使用时进行初始化,例如初始化静态变量或配置类的特定行为。+initialize只在需要时调用,适合用来设置那些不必在应用启动时立即配置的内容。
3. 执行顺序
+load的执行顺序是固定的:- 先执行主类的
+load,然后依次执行分类的+load(根据编译顺序)。 - 其执行顺序与类的继承结构无关。
- 先执行主类的
+initialize的执行顺序是动态的:- 当类的某个方法第一次被调用时,系统会先调用该类的
+initialize。如果子类没有实现+initialize,则会调用父类的+initialize。
- 当类的某个方法第一次被调用时,系统会先调用该类的
总结
+load:在类或分类加载时执行,用于最早期的初始化。+initialize:在类第一次被使用时执行,用于延迟初始化或按需加载。
本文由作者按照 CC BY 4.0 进行授权