当前位置: 首页 > news >正文

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

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

在 Objective-C 中,+load 方法是在类或分类被加载到内存时调用的。它在程序启动过程中非常早的阶段执行,用于在类或分类被加载时进行一些初始化工作。理解 +load 方法的执行顺序对于编写可靠的 Objective-C 代码非常重要。本文将详细探讨 +load 方法在类、子类和分类中的执行顺序。

+load 方法的基本介绍

+load 方法是一个类方法,在类或分类被加载时自动调用。与 +initialize 方法不同,+load 方法只会被调用一次,并且在加载类和分类时立即执行,而不等待任何实例的创建。

类和子类中的执行顺序

当一个类和它的子类都实现了 +load 方法时,执行顺序如下:

  1. 父类的 +load 方法 先于 子类的 +load 方法 执行。
  2. 在同一个继承层次结构中,类的 +load 方法按照编译顺序执行。

例如,考虑以下代码:

#import <Foundation/Foundation.h>@interface SuperClass : NSObject
@end@implementation SuperClass
+ (void)load {NSLog(@"SuperClass +load");
}
@end@interface SubClass : SuperClass
@end@implementation SubClass
+ (void)load {NSLog(@"SubClass +load");
}
@endint main(int argc, const char * argv[]) {@autoreleasepool {// 程序启动时自动调用 `+load` 方法}return 0;
}

输出结果将是:

SuperClass +load
SubClass +load

分类中的执行顺序

分类中的 +load 方法的执行顺序稍微复杂一些:

  1. 分类的 +load 方法 在其所属类的 +load 方法之后执行。
  2. 如果一个类有多个分类,那么分类的 +load 方法的执行顺序是不确定的。这意味着我们不应该依赖于分类的加载顺序来编写代码。

考虑以下示例:

@interface SubClass (Category1)
@end@implementation SubClass (Category1)
+ (void)load {NSLog(@"SubClass (Category1) +load");
}
@end@interface SubClass (Category2)
@end@implementation SubClass (Category2)
+ (void)load {NSLog(@"SubClass (Category2) +load");
}
@end

在上述代码的基础上,输出结果可能是:

SuperClass +load
SubClass +load
SubClass (Category1) +load
SubClass (Category2) +load

或:

SuperClass +load
SubClass +load
SubClass (Category2) +load
SubClass (Category1) +load

父类分类的执行顺序

如果父类的分类也实现了 +load 方法,执行顺序如下:

  1. 父类的 +load 方法
  2. 父类分类的 +load 方法(按任意顺序)。
  3. 子类的 +load 方法
  4. 子类分类的 +load 方法(按任意顺序)。

考虑以下示例代码:

@interface SuperClass (Category)
@end@implementation SuperClass (Category)
+ (void)load {NSLog(@"SuperClass (Category) +load");
}
@end

结合之前的代码,输出结果将是:

SuperClass +load
SuperClass (Category) +load
SubClass +load
SubClass (Category1) +load
SubClass (Category2) +load
http://www.lryc.cn/news/407335.html

相关文章:

  • C++:类和对象2
  • Docker安装kkFileView实现在线文件预览
  • ElasticSearch(四)— 数据检索与查询
  • Pytest之parametrize()实现数据驱动
  • 关于鸿蒙系统前景
  • 针对datax-web 中Swagger UI接口未授权访问
  • 生成式AI如何帮助小型企业高效运营?
  • 2024最新网络安全自学路线,内容涵盖3-5年技能提升
  • Postman API测试数据生成秘籍:技巧与实践
  • 【接口自动化_07课_Pytest+Excel+Allure完整框架集成_下】
  • Java开发之反射与动态代理
  • 实习日志1之大模型相关知识概览
  • 华为嵌入式面试题及参考答案(持续更新)
  • Java二十三种设计模式-装饰器模式(7/23)
  • 正则表达式与文本处理
  • Python | Leetcode Python题解之第283题移动零
  • 微信小程序面试题汇总
  • 学习日志:JVM垃圾回收
  • Vue前端页面嵌入mermaid图表--流程图
  • 【web]-反序列化-easy ? not easy
  • python 内置函数、math模块
  • Ubuntu Docker 安装
  • vue接入google map自定义marker教程
  • Spring Boot集成Redis与Lua脚本:构建高效的分布式多规则限流系统
  • 四、单线程多路IO复用+多线程业务工作池
  • 单元测试--Junit
  • 达梦数据库系列—30. DTS迁移Mysql到DM
  • 随记0000——从0、1 到 C语言
  • C++ | Leetcode C++题解之第264题丑数II
  • 前端系列-8 集中式状态管理工具pinia