返回

深入探究iOS底层原理:分类加载机制大揭秘

IOS

主类加载与分类加载流程揭秘

在iOS底层原理之OC类的加载原理(中),我们探索了类加载的基本原理,以及懒加载类与非懒加载类不同的加载流程。本篇文章,我们将进一步深入剖析分类加载的机制,揭开它背后的秘密。

iOS中,分类加载分为两大类:继承分类和扩展分类。继承分类加载遵循一定的规则,先加载主类,再加载子类,最终完成分类加载;而扩展分类加载则相对简单,它直接加载扩展分类,而无需关心主类加载情况。

继承分类加载流程

当遇到继承分类加载时,系统会根据以下步骤进行加载:

  1. 检查主类是否已经加载 :如果主类已经加载,则直接加载分类;否则,先加载主类,再加载分类。
  2. 加载主类 :在加载主类时,系统会按照以下步骤进行:
    • 初始化类对象:系统会为类创建一个类对象,类对象存储了类的元数据信息,如类名、属性列表、方法列表等。
    • 准备类结构:系统会根据类对象的元数据信息,创建类的结构,该结构包含了类的所有成员变量和方法的地址。
    • 分配类内存:系统会为类分配内存空间,并把类的结构复制到内存空间中。
    • 初始化类变量:系统会调用类的初始化方法,对类的变量进行初始化。
  3. 加载分类 :在加载分类时,系统会按照以下步骤进行:
    • 初始化分类对象:系统会为分类创建一个分类对象,分类对象存储了分类的元数据信息,如分类名、属性列表、方法列表等。
    • 准备分类结构:系统会根据分类对象的元数据信息,创建分类的结构,该结构包含了分类的所有成员变量和方法的地址。
    • 分配分类内存:系统会为分类分配内存空间,并把分类的结构复制到内存空间中。
    • 初始化分类变量:系统会调用分类的初始化方法,对分类的变量进行初始化。

扩展分类加载流程

扩展分类加载相对简单,它直接加载扩展分类,而无需关心主类加载情况。加载过程如下:

  1. 初始化扩展分类对象 :系统会为扩展分类创建一个扩展分类对象,扩展分类对象存储了扩展分类的元数据信息,如扩展分类名、属性列表、方法列表等。
  2. 准备扩展分类结构 :系统会根据扩展分类对象的元数据信息,创建扩展分类的结构,该结构包含了扩展分类的所有成员变量和方法的地址。
  3. 分配扩展分类内存 :系统会为扩展分类分配内存空间,并把扩展分类的结构复制到内存空间中。
  4. 初始化扩展分类变量 :系统会调用扩展分类的初始化方法,对扩展分类的变量进行初始化。

主类加载与分类加载异同比较

通过对主类加载与分类加载流程的分析,我们可以总结出两者之间的异同:

  • 相同点
    • 都会初始化类对象、准备类结构、分配类内存、初始化类变量。
    • 都会调用类的初始化方法。
  • 不同点
    • 主类加载需要先加载主类,再加载分类;而分类加载不需要关心主类加载情况。
    • 主类加载需要初始化类对象,而分类加载不需要。
    • 主类加载需要准备类结构,而分类加载不需要。
    • 主类加载需要分配类内存,而分类加载不需要。
    • 主类加载需要初始化类变量,而分类加载不需要。

结语

至此,我们对iOS底层原理系列文章进行了一个完整的收尾,从OC类的基本原理,到懒加载类和非懒加载类的加载流程,再到继承分类加载和扩展分类加载的流程,相信各位读者已经对iOS底层原理有了一个更加深入的了解。希望这些文章能够帮助大家更好地理解iOS底层原理,从而为开发出更加优秀的iOS应用打下坚实的基础。