0

0

对于load方法的理解

絕刀狂花

絕刀狂花

发布时间:2025-07-17 08:48:33

|

548人浏览过

|

来源于php中文网

原创

写在前面

关于load方法,我想大家应该已经有所了解。本文主要记录我在阅读ObjC源码时对load方法的新认知,因此文中会引用一些关键的ObjC源码。

+ load 是 Objective-C 中的一个方法,它会在整个文件被加载到运行时,并且在 main 函数调用之前由 ObjC 运行时调用。

本文将讨论关于+ load方法的三个问题:

  • load方法如何被调用。
  • load方法的调用顺序。
  • load方法的作用。

load方法是如何被调用的

对于load方法的理解

我们可以清楚地看到,在+load方法之前被调用的方法包括:

1  call_class_loads()
2  call_load_methods
3  load_images
4  dyld::notifySingle(dyld_image_states, ImageLoader const*)
11 _dyld_start

(滑动显示更多)

dyld 是 the dynamic link editor 的缩写,它是苹果的动态链接器。

在我们启动App时,真正的加载过程是从exec()函数开始,系统会调用exec()函数创建进程并分配内存空间。随后会执行以下操作:

将App对应的可执行文件加载到内存。 将dyld加载到内存。dyld本身也是一个可执行程序。 dyld进行动态链接。dyld的工作内容包括:

dyld会找到可执行文件依赖的动态库。 接着dyld会将这些依赖的动态库加载到内存中。这是一个递归过程,因为依赖的动态库可能还会依赖其他动态库,所以dyld会递归每个动态库,直到所有依赖库都被加载完毕。 Rebase和Binding。每当有新的镜像加载之后,都会执行 load_images 方法进行回调,这里的回调是在整个运行时初始化时 _objc_init 注册的。

对于load方法的理解

关于镜像的概念:

对于load方法的理解

Mach-O 是 iOS 系统不同运行时期可执行文件的文件类型统称。

Mach-O 有三种文件类型:Executable、Dylib、Bundle。

Executable:app 的二进制主文件,同时也是 app extension 的二进制主文件。

Dylib:动态库。

Bundle:资源文件包。

镜像文件包含了上述的三种文件类型。

腾讯小微
腾讯小微

基于微信AI智能对话系统打造的智能语音助手解决方案

下载

看到 load_images 方法

对于load方法的理解

首先会调用 prepare_load_methods 对 load 方法的调用进行准备。

prepare_load_methods 方法的作用:

递归地加载当前类和未调用+ load 的父类进入加载列表,在将当前类加入加载列表之前,会先将父类加入待加载的列表,确保父类的 load 方法在子类之前调用。

然后开始调用 call_load_methods 方法。

对于load方法的理解

其中 call_class_loads 会从一个待加载的类列表 loadable_classes 中寻找对应的类,然后找到 @selector(load) 的实现并执行。

对于load方法的理解

这时就执行了 [XXX load] 方法。

load方法的调用顺序

当父类和子类都实现了 load 函数时,父类的 load 方法执行顺序优先于子类。 当一个类未实现 load 方法时,不会调用父类的 load 方法。 类中的 load 方法执行顺序优先于类别(Category)。 当多个类别(Category)都实现了 load 方法时,这些 load 方法都会执行,但执行顺序不确定(其执行顺序与类别在 Compile Sources 中出现的顺序一致)。 当有多个不同的类时,每个类的 load 执行顺序与其在 Compile Sources 出现的顺序一致。

load方法的作用

在 main 运行之前,load 方法就会被调用。

由于它的调用不是惰性的,且其只会在程序调用期间调用一次,最重要的是,如果在类与分类中都实现了 load 方法,它们都会被调用,不像其他在分类中实现的方法会被覆盖,这使得 load 方法成为了方法交换(Method Swizzling)的绝佳时机。

load方法注意事项:

load 调用时机较早,当 load 调用时,其他类可能尚未加载完成,运行环境不安全。不过在这个时间点,所有的 framework 都已经加载到了运行时中,所以调用 framework 中的方法是安全的。

load 方法是线程安全的,它使用了锁,我们应该避免在 load 方法中导致线程阻塞。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

13

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

60

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

17

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

157

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php初学者入门课程
php初学者入门课程

共10课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号