返回

iOS底层探索(十八):浅析 _objc_init

IOS

正文

在学习 _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 函数中,主要做了三件事:

  1. 初始化类簇
  2. 初始化协议
  3. 初始化分类

类簇、协议和分类都是 Objective-C 语言中的重要概念,它们对于 Objective-C 程序的运行是必不可少的。因此,_objc_init 函数在初始化这些数据结构的时候,也做了非常多的工作。

由于篇幅有限,我们在这里就不详细介绍 _objc_init 函数中是如何初始化这些数据结构的。如果你有兴趣,可以参考 Objective-C 运行时的源代码。

总之,_objc_init 函数是 Objective-C 运行时初始化过程中的一个重要步骤,它主要负责初始化类簇、协议和分类这些数据结构。