返回

在 ARC 下 iOS 底层原理之 OC 类的加载原理(中)

IOS

前言

iOS 底层原理之 OC 类的加载原理(上) 中,我们分析了 _objc_init->map_images->_read_images 的整个流程,最后定位到类的初始化是在 realizeClassWithout 函数中完成的。本文将继续深入探索这个函数,分析 OC 类的加载原理在 ARC 环境下的实现。

realizeClassWithout 函数

realizeClassWithout 函数的声明如下:

Class realizeClassWithoutInitialization(Class cls, BOOL initialize);

这个函数的作用是实现类的初始化。第一个参数 cls 是要初始化的类,第二个参数 initialize 指定是否需要初始化该类。

在 ARC 环境下,realizeClassWithout 函数的实现与非 ARC 环境下略有不同。在 ARC 环境下,realizeClassWithout 函数会调用 objc_loadClassWithWeakIvars 函数来进行类的初始化。

objc_loadClassWithWeakIvars 函数

objc_loadClassWithWeakIvars 函数的声明如下:

Class objc_loadClassWithWeakIvars(Class cls, BOOL weakIvars);

这个函数的作用是加载一个类,并设置类的弱引用 ivar。第一个参数 cls 是要加载的类,第二个参数 weakIvars 指定是否使用弱引用 ivar。

在 ARC 环境下,objc_loadClassWithWeakIvars 函数会执行以下步骤:

  1. 调用 objc_loadWeakIvars 函数设置类的弱引用 ivar。
  2. 调用 objc_loadClass 函数加载该类。
  3. 调用 objc_registerClass 函数注册该类。

objc_loadWeakIvars 函数

objc_loadWeakIvars 函数的声明如下:

void objc_loadWeakIvars(Class cls);

这个函数的作用是设置类的弱引用 ivar。它会遍历类的 ivar 列表,如果 ivar 的类型是对象类型,则将 ivar 设置为弱引用 ivar。

objc_loadClass 函数

objc_loadClass 函数的声明如下:

Class objc_loadClass(const char *name);

这个函数的作用是加载一个类。它会调用 _objc_init 函数初始化类,然后调用 _objc_registerClass 函数注册该类。

objc_registerClass 函数

objc_registerClass 函数的声明如下:

void objc_registerClass(Class cls);

这个函数的作用是注册一个类。它会将类添加到类的全局注册表中,以便可以从其他地方访问该类。

总结

在 ARC 环境下,realizeClassWithout 函数会调用 objc_loadClassWithWeakIvars 函数来进行类的初始化。objc_loadClassWithWeakIvars 函数会设置类的弱引用 ivar,然后调用 objc_loadClass 函数加载该类,最后调用 objc_registerClass 函数注册该类。