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

理解 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 方法。理解这个执行顺序对调试和优化应用的初始化过程至关重要。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于SpringCloud alibaba的流媒体视频点播平台
  • 拦截器和过滤器
  • 抽象代数精解【9】
  • C# 设计模式六大原则之依赖倒置原则
  • MySQL的简单介绍
  • nuclei-快速漏洞扫描器【安装使用详解】
  • 鸿蒙AI功能开发【人脸活体验证控件】 机器学习-场景化视觉服务
  • 前端发版(发包)缓存,需要强制刷新问题处理
  • git版本控制的底层实现
  • Flink 实时数仓(四)【DWD 层搭建(二)流量域事实表】
  • enq: HW - contention事件来啦
  • fme从json中提取位置到kml中
  • react引入高德地图并初始化卫星地图
  • 【Go - 编译:浅尝辄止 】
  • 华为云全域Serverless技术创新:全球首创通用Serverless平台被ACM SIGCOMM录用
  • @angular/forms 源码解析之双向绑定
  • [NodeJS] 关于Buffer
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • ➹使用webpack配置多页面应用(MPA)
  • angular组件开发
  • Java 多线程编程之:notify 和 wait 用法
  • javascript数组去重/查找/插入/删除
  • Redis在Web项目中的应用与实践
  • SQLServer之创建显式事务
  • 关于Flux,Vuex,Redux的思考
  • 解析 Webpack中import、require、按需加载的执行过程
  • 马上搞懂 GeoJSON
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 用quicker-worker.js轻松跑一个大数据遍历
  • ionic异常记录
  • 带你开发类似Pokemon Go的AR游戏
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • ## 基础知识
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #NOIP 2014# day.1 T2 联合权值
  • $ git push -u origin master 推送到远程库出错
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (a /b)*c的值
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (七)Knockout 创建自定义绑定
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (算法)区间调度问题
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .a文件和.so文件
  • @Autowired 与@Resource的区别
  • [20180224]expdp query 写法问题.txt
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色