• 理解 Objective-C 中 +load 方法的执行顺序


    Objective-C 中,+load 方法是在类或分类(category)被加载到内存时调用的。它的执行顺序非常严格,并且在应用启动过程中可能会导致一些令人困惑的行为。理解 +load 方法的执行顺序对调试和控制应用的初始化过程非常重要。

    +load 方法的执行顺序

    1. 类的 +load 方法:首先,所有类的 +load 方法会按照以下顺序执行

      • 按照类的编译顺序执行。
      • 主类的 +load 方法先于它的任何子类的 +load 方法执行。
    2. 分类的 +load 方法:其次,所有分类的 +load 方法会按照以下顺序执行:

      • 在定义该分类的类的 +load 方法之后执行。
      • 多个分类的 +load 方法的执行顺序不确定(即,编译器可能会以任何顺序执行这些分类的 +load 方法)。

    +load 方法的具体执行顺序示例

    假设有如下的类和分类:

    // SuperClass.h
    @interface SuperClass : NSObject
    @end
    
    // SuperClass.m
    @implementation SuperClass
    + (void)load {
        NSLog(@"SuperClass +load");
    }
    @end
    
    // SubClass.h
    @interface SubClass : SuperClass
    @end
    
    // SubClass.m
    @implementation SubClass
    + (void)load {
        NSLog(@"SubClass +load");
    }
    @end
    
    // SuperClass+CategoryA.h
    @interface SuperClass (CategoryA)
    @end
    
    // SuperClass+CategoryA.m
    @implementation SuperClass (CategoryA)
    + (void)load {
        NSLog(@"SuperClass (CategoryA) +load");
    }
    @end
    
    // SubClass+CategoryB.h
    @interface SubClass (CategoryB)
    @end
    
    // SubClass+CategoryB.m
    @implementation SubClass (CategoryB)
    + (void)load {
        NSLog(@"SubClass (CategoryB) +load");
    }
    @end
    

    根据上面的规则,执行顺序如下:

    1. SuperClass +load

      • 首先执行,因为它是最高级别的类。
    2. SubClass +load

      • 接着执行,因为它是 SuperClass 的子类。
    3. SuperClass (CategoryA) +load

      • 在主类 SuperClass 的 +load 方法之后执行。
    4. SubClass (CategoryB) +load

      • 最后执行,在主类 SubClass 的 +load 方法之后。

    注意事项

    • +load 方法的执行顺序是由运行时系统决定的,不受代码文件的排列顺序影响。
    • +load 方法在整个应用生命周期中只会被调用一次。
    • 由于 +load 方法的执行是在应用的初始化阶段,避免在 +load 方法中执行过于复杂或耗时的操作,这可能会影响应用的启动时间。
    • 相比之下,+initialize 方法是在类的第一次使用时调用的,因此可以用于延迟初始化一些依赖其他类或配置的任务。

    结论

    +load 方法在 Objective-C 中按照严格的顺序执行:先执行类的 +load 方法,再执行分类的 +load 方法,且主类的 +load 方法优先于子类的 +load 方法。理解这个执行顺序对调试和优化应用的初始化过程至关重要。

  • 相关阅读:
    Python实操 PDF自动识别并提取Excel文件
    基于SpringBoot+Vue的超市货物管理系统
    Ubuntu 22.04. 安装微信
    零基础自学javase黑马课程第七天
    Django测试与持续集成:从入门到精通
    我的创作纪念日
    [附源码]Python计算机毕业设计Django的小区宠物管理系统
    python 操作windows的Wlan
    NC16884 [NOI2001]食物链
    关于QTableWidget的it所占内存的释放问题
  • 原文地址:https://blog.csdn.net/qq_43689451/article/details/140916839