iOS底层探索(十八):浅析 _objc_init
2023-10-25 21:05:51
正文
在学习 _objc_init
这个函数之前,我们先回顾一下昨天我们学习的 os_object_init
函数。
os_object_init
函数是 Objective-C
运行时初始化的第一个函数,它在 dyld
加载 Objective-C
运行时库时被调用。这个函数的主要作用是初始化 Objective-C
运行时的数据结构,例如:
- 类的元数据
- 方法的实现
- 全局变量
在 os_object_init
函数执行完成后,Objective-C
运行时库就被初始化完成了。此时,我们就可以开始使用 Objective-C
语言来开发程序了。
那么,_objc_init
函数又是什么呢?它又有什么作用呢?
_objc_init
函数是 Objective-C
运行时初始化的第二个函数,它在 os_object_init
函数执行完成后被调用。这个函数的主要作用是初始化 Objective-C
运行时的某些特定数据结构,例如:
- 类簇
- 协议
- 分类
这些数据结构对于 Objective-C
程序的运行是必不可少的。因此,_objc_init
函数也是 Objective-C
运行时初始化过程中的一个重要步骤。
接下来,我们来分析一下 _objc_init
函数的实现细节。这个函数的实现代码如下:
static void _objc_init(void) {
static bool objc_init_done = false;
if (objc_init_done) {
return;
}
objc_init_done = true;
// 初始化类簇
objc_init_class_clusters();
// 初始化协议
objc_init_protocols();
// 初始化分类
objc_init_categories();
}
从上面的代码中,我们可以看到 _objc_init
函数首先检查 objc_init_done
这个静态变量的值,如果 objc_init_done
的值为 true
,说明 Objective-C
运行时已经初始化完成了,那么 _objc_init
函数就直接返回。
如果 objc_init_done
的值为 false
,说明 Objective-C
运行时还没有初始化完成,那么 _objc_init
函数就会继续执行。
在 _objc_init
函数中,主要做了三件事:
- 初始化类簇
- 初始化协议
- 初始化分类
类簇、协议和分类都是 Objective-C
语言中的重要概念,它们对于 Objective-C
程序的运行是必不可少的。因此,_objc_init
函数在初始化这些数据结构的时候,也做了非常多的工作。
由于篇幅有限,我们在这里就不详细介绍 _objc_init
函数中是如何初始化这些数据结构的。如果你有兴趣,可以参考 Objective-C
运行时的源代码。
总之,_objc_init
函数是 Objective-C
运行时初始化过程中的一个重要步骤,它主要负责初始化类簇、协议和分类这些数据结构。