当前位置: 首页 > 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【大模型基础】4.1 数据挖掘(待)
  • Xubuntu22.04 终端命令调用图形设置工具
  • 化腐朽为神奇!揭开ISP图像处理的神秘面纱,基于瑞芯微RK3568J工业平台!
  • Domainim:一款高效的企业级网络安全扫描工具
  • gitee设置ssh公钥密码频繁密码验证
  • 【spring boot】初学者项目快速练手
  • 攻防世界 re新手模式
  • 分层评估的艺术:sklearn中的策略与实践
  • jenkins面试题全集
  • 前端经验:使用sheetjs导出CSV文本为excel
  • MATLAB学习日志DAY13
  • vulntarget-a靶机-复现报告
  • 1.Vue基础(@事件名+v-show+created+v-bind)
  • 2024 年 100 大数据科学面试问答
  • 字符的统计——423、657、551、696、467、535
  • 2017-09-12 前端日报
  • JavaScript标准库系列——Math对象和Date对象(二)
  • jQuery(一)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Laravel5.4 Queues队列学习
  • leetcode386. Lexicographical Numbers
  • Mithril.js 入门介绍
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Node项目之评分系统(二)- 数据库设计
  • Shell编程
  • swift基础之_对象 实例方法 对象方法。
  • vue-cli3搭建项目
  • windows-nginx-https-本地配置
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于springcloud Gateway中的限流
  • 跨域
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 云大使推广中的常见热门问题
  • puppet连载22:define用法
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 移动端高清、多屏适配方案
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​secrets --- 生成管理密码的安全随机数​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #define、const、typedef的差别
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (蓝桥杯每日一题)love
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (十)c52学习之旅-定时器实验
  • (学习日记)2024.01.19
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET下ASPX编程的几个小问题
  • .net项目IIS、VS 附加进程调试