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

news/2024/9/11 3:33:01/ 标签: c++, 图论, 算法

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


http://www.ppmy.cn/news/1508616.html

相关文章

CVE-2024-38077:Windows远程桌面授权服务的‘隐形杀手’——深度剖析与紧急防护策略

文章目录 CVE-2024-38077:Windows远程桌面授权服务的‘隐形杀手’——深度剖析与紧急防护策略1 漏洞描述2 漏洞影响2.1 处置优先级:高2.2 影响版本 3 漏洞检测3.1 漏洞检测工具3.2 漏洞检测工具使用介绍3.2.1 漏洞检测工具当前支持三种方式检测3.2.2 漏洞…

【迁移学习】迁移学习的基本概念与应用

迁移学习 迁移学习的基本概念与应用 引言 迁移学习是一种机器学习技术,旨在将从一个领域中学到的知识应用到另一个相关领域中,以解决目标任务的训练数据不足和模型训练时间过长的问题。它在计算机视觉、自然语言处理等领域中得到了广泛应用。本文将详细…

2024年华为OD机试真题-学生重新排队-Python-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: n个学生排成一排,学生编号分别是1到n,n为3的整倍数。老师随机抽签决定将所有学生分成m个3人的小组,n=3*m 为了便于同组学生交流,老师决定将小组成员安排到一起,也就是同…

java和c++两种语言的多态对比(java选手转c++必学!)多态-保研机试,大厂面试必问

多态(Polymorphism)是面向对象编程(OOP)中的一个重要概念,指的是同一个接口或基类在不同情况下可以表现出不同的行为。多态允许对象通过相同的接口或方法名以不同的方式执行操作,这种能力使代码更加灵活和可…

【唐氏题目 nt题】与众不同

# 与众不同 ## 题目描述 A是某公司的CEO,每个月都会有员工把公司的盈利数据送给A,A是个与众不同的怪人,A不注重盈利还是亏本,而是喜欢研究「完美序列」:一段连续的序列满足序列中的数互不相同。 A想知道区间[L,R]之…

“头”和“段”里有什么? ——WEB开发系列04

作为前端开发人员&#xff0c;理解HTML的基本结构及语义是至关重要的。我们将继续深入探讨HTML中的标题&#xff08;​​<h1>​​到​​<h6>​​标签&#xff09;和段落&#xff08;​​<p>​​标签&#xff09;。 1. HTML文档结构回顾 在深入标题和段落之前…

芯片bring-up的测试用例

文章目录 前言一、测试用例的规划和编写原则1、冒烟测试1&#xff09;电源时钟复位测试2&#xff09;寄存器扫描测试3&#xff09;单一功能冒烟测试 二、遍历测试三、随机测试四、性能测试五、压力测试 总结 前言 最近做了一些用测试用例点亮芯片的工作&#xff0c;从测试用例…

LabVIEW电机测试系统

LabVIEW电机测试系统采用共直流母线架构&#xff0c;优化能量循环方式&#xff0c;实现内部能量循环。系统利用高精度仪器与先进软件技术&#xff0c;提供了一个高效、可靠的测试平台&#xff0c;适用于200 kW以下的交流异步电机和永磁同步电机的性能及耐久性测试。 项目背景 …

Unity读取Android外部文件

最近近到个小需求,需要读Android件夹中的图片.在这里做一个记录. 首先读写部分,这里以图片为例子: 一读写部分 写入部分: 需要注意的是因为只有这个地址支持外部读写,所以这里用到的地址都以 :Application.persistentDataPath为地址起始. private Texture2D __CaptureCamera…

OpenHarmony南向开发 SA服务SELinux权限配置一站式傻瓜式教程

Selinux权限配置 OpenHarmony中SELinux使用详解 目录 SELinux简介SELinux概念SELinux模式OH中SELinux使用详解新增SA服务如何配置SELinux权限SELinux简介 SELinux是Security Enhanced Linux 的缩写,也就是安全强化的 Linux,旨在增强传统Linux操作系统的安全性,解决传统Li…

单调队列《滑动窗口》

#include <iostream>using namespace std;const int N 100010;int m; int q[N], hh, tt -1;//hh表示队头&#xff0c;tt表示队尾int main() {cin >> m;while (m -- ){string op;int x;cin >> op;if (op "push"){cin >> x;q[ tt] x;//队…

Linux Vim教程(十五):使用Vimscript进行脚本编写

目录 1. Vimscript简介 2. 基本语法和结构 2.1 变量 2.2 条件语句 2.3 循环语句 2.4 函数 3. 操作缓冲区、窗口和标签页 3.1 缓冲区 3.2 窗口 3.3 标签页 4. 自动化编辑任务 4.1 自动命令 4.2 键映射 5. 编写和调试Vimscript脚本 5.1 编写脚本 5.2 调试脚本 6…

魔方远程时时获取短信内容APP 前端Vue 后端Ruoyi框架(含搭建教程)

前端Vue 后端Ruoyi框架 APP原生JAVA 全兼容至Android14(鸿蒙 澎湃等等) 前后端功能&#xff1a; ①后端可查看用户在线状态(归属地IP) ②发送短信(自定义输入收信号码以及短信内容&#xff0c;带发送记录) ③短信内容分类清晰(接收时间、上传时间等等) ④前后端分离以及A…

【AWS账号解绑关联】Linker账号解绑重新关联注意事项

文章目录 一、来自客户疑问二、提交工单获取帮助三、最佳操作说明四、最佳操作步骤五、参考资料活动上新 一、来自客户疑问 将Linker账号&#xff0c;从一个组织中退出&#xff0c;重新关联到新的组织中&#xff0c;这解绑到重新完成新的关联绑定期间会在Linker账号中的账单中…

力扣高频SQL 50题(基础版)第四十二题之1517.查找拥有有效邮箱的用户

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十二题1517.查找拥有有效邮箱的用户题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十二题 1517.查找拥有有效邮箱的用户 题目说明 表: Users -----------…

Xcode自定义模板:提升开发效率的秘诀

Xcode自定义模板&#xff1a;提升开发效率的秘诀 引言 在iOS开发中&#xff0c;Xcode的自定义模板是一项强大的功能&#xff0c;它允许开发者根据自己的开发习惯和项目需求&#xff0c;创建个性化的代码和项目模板。这不仅可以加快开发速度&#xff0c;还能保持代码的一致性和…

C#使用Puppeteer

Puppeteer Puppeteer是一个Node.js库&#xff0c;它提供了高级API来通过DevTools协议(Chrome DevTools Protocol https://devtools.chrome.com)控制Chrome或Chromium。 Puppeteer默认情况下无头运行(headless)。 可以配置为运行完整的Chrome或Chromium&#xff0c;运行效果如…

oracle rac

1、app连接oracle rac集群 连接到 Oracle RAC&#xff08;Real Application Clusters&#xff09;的多种配置方式 1. 使用 JDBC 连接字符串&#xff1a; 使用 JDBC 连接字符串是连接 Oracle RAC 的常见方式。连接字符串的格式如下&#xff1a; jdbc:oracle:thin:(DESCRIPTION…

2024年8月7日(mysql主从 )

回顾 主服务器 [rootmaster_mysql ~]# yum -y install rsync [rootmaster_mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar [rootmaster_mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz [rootmaster_mysql ~]# cp -r mysql-8.0.33-linux-glibc2.…

Docker基础知识大全

文章目录 前言一、Docker为什么出现&#xff1f;二、Docker历史三、Docker能干嘛&#xff1f;四、Docker名词五、Docker安装&#xff08;CentOS7&#xff09;六、卸载docker命令七、Docker镜像容器命令总结 1、Docker为什么出现&#xff1f; java jar包 打包项目带上环境&…