在 ARC 下 iOS 底层原理之 OC 类的加载原理(中)
2023-11-02 06:03:42
前言
在 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
函数会执行以下步骤:
- 调用
objc_loadWeakIvars
函数设置类的弱引用 ivar。 - 调用
objc_loadClass
函数加载该类。 - 调用
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
函数注册该类。