返回

类的加载是OC底层的基础,全方位解析

IOS

前言

在前面一节内容中,我们了解了OC底层之dyld主要重点分析了应用程序的加载流程,本文重点分析类的加载流程。应用程序的加载流程主要是使用dyld将磁盘上的Mach-O文件和虚拟内存表产生产生了联系,也就是确定了应用程序的内存布局。应用程序运行过程中创建一个进程,OC底层的类加载是运行时期动态的,在本文中将详细解释类的加载流程。

类加载流程概述

类的加载流程主要可以分为以下几个步骤:

  1. 类查找: 首先会尝试在已加载的类表中查找该类,如果找到,则直接返回。如果没有找到,则会到运行时环境中查找该类。
  2. 类加载: 如果在运行时环境中找到了该类,则会将该类的Mach-O文件加载到内存中。
  3. 类链接: 将该类的符号与其他类或库的符号进行链接,以便可以调用其他类的函数或使用其他类的变量。
  4. 类初始化: 执行该类的静态构造函数,以初始化该类的静态成员变量。

类查找

类查找主要是在已加载的类表中进行查找,如果找到,则直接返回。如果没有找到,则会到运行时环境中查找该类。运行时环境主要包括以下几个地方:

  1. 应用程序的Mach-O文件: 应用程序的Mach-O文件中包含了应用程序所使用的所有类的信息,包括类的名称、类的结构、类的成员变量和类的函数等。
  2. 框架的Mach-O文件: 框架是应用程序可以使用的预编译代码库,框架的Mach-O文件中也包含了框架所使用的所有类的信息。
  3. 动态库的Mach-O文件: 动态库是应用程序可以动态加载的代码库,动态库的Mach-O文件中也包含了动态库所使用的所有类的信息。

类加载

如果在运行时环境中找到了该类,则会将该类的Mach-O文件加载到内存中。类加载主要包括以下几个步骤:

  1. 将Mach-O文件映射到内存中: 将Mach-O文件的内容映射到内存中,以便可以访问Mach-O文件中的信息。
  2. 解析Mach-O文件: 解析Mach-O文件中的信息,包括类的名称、类的结构、类的成员变量和类的函数等。
  3. 创建类对象: 根据解析的信息创建一个类对象,类对象包含了类的名称、类的结构、类的成员变量和类的函数等信息。

类链接

将该类的符号与其他类或库的符号进行链接,以便可以调用其他类的函数或使用其他类的变量。类链接主要包括以下几个步骤:

  1. 符号解析: 解析该类的符号,包括类的名称、类的成员变量和类的函数等。
  2. 符号绑定: 将该类的符号与其他类或库的符号进行绑定,以便可以调用其他类的函数或使用其他类的变量。

类初始化

执行该类的静态构造函数,以初始化该类的静态成员变量。类初始化主要包括以下几个步骤:

  1. 查找静态构造函数: 在类对象中查找静态构造函数。
  2. 执行静态构造函数: 执行静态构造函数,以便初始化该类的静态成员变量。

总结

类的加载是OC底层的基础,类的加载流程主要分为类查找、类加载、类链接和类初始化四个步骤。类的加载是运行时期动态的,以便可以动态地加载和使用类。类的加载对于应用程序的运行至关重要,如果类的加载失败,则应用程序将无法运行。