文章

OC load 和 initialize 有什么区别

1. 触发时机

  • +load 方法

    • 当类或其分类(category)被加载到内存时,系统会立即调用 +load 方法。
    • +load 会在应用启动时自动运行,不需要显式调用父类的 +load
    • 每个类及其分类的 +load 都会依次执行,顺序如下:
      1. 先执行主类的 +load 方法。
      2. 然后按编译顺序依次执行分类的 +load 方法。
    • 因为 +load 在加载类时调用,所以在其执行时,应用的其他部分可能尚未初始化。
  • +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 进行授权