返回

分类加载之原理和主类加载关系

IOS

正文:

一、分类的本质和特点

  • 分类(Category)是Objective-C中强大的扩展机制,它允许在不修改原有类的源代码的情况下,为该类添加新的方法、属性或修改原有方法的实现。
  • 分类是对原有类的扩展,而不是修改,因此不需要重新编译或链接原有类的源代码。
  • 分类可以应用于任何类,包括系统类和用户自定义类。
  • 类别的声明和实现可以通过.h文件和.m文件来完成,也可以通过@interface和@implementation指令直接在源代码中实现。

二、分类加载的原理

  • 分类加载的原理与类加载的原理类似,也是通过运行时机制来完成的。
  • 当首次使用分类时,系统会首先尝试加载该分类的二进制代码。
  • 如果分类的二进制代码已经存在,则直接将其加载到内存中。
  • 如果分类的二进制代码不存在,则系统会尝试从分类的源代码文件(.h和.m文件)中生成二进制代码。
  • 生成二进制代码的过程与类加载的过程类似,都涉及到预处理、编译和链接等步骤。
  • 生成二进制代码后,系统会将其加载到内存中,并将其与主类进行合并。

三、分类与主类之间的加载关系

  • 分类与主类之间的加载关系可以分为两种情况:

    • 1. 分类与主类在同一个文件中定义

      这种情况下,分类和主类会被同时加载到内存中,并且分类会被合并到主类中。
      合并后的类包含了主类和分类的所有方法和属性,并且分类的方法和属性会覆盖主类中的同名方法和属性。

    • 2. 分类与主类在不同的文件中定义

      这种情况下,分类和主类会被分别加载到内存中,并且分类不会被合并到主类中。
      在这种情况下,分类中的方法和属性只能通过分类的名称来调用,不能通过主类的名称来调用。

四、分类的二进制合并流程

  • 分类与主类进行二进制合并的过程可以分为以下几个步骤:

    • 1. 准备工作

      • 首先,系统会准备分类和主类的二进制代码。
      • 如果分类和主类的二进制代码已经存在,则直接将其加载到内存中。
      • 如果分类和主类的二进制代码不存在,则系统会尝试从分类和主类的源代码文件中生成二进制代码。
    • 2. 符号解析

      • 系统会对分类和主类的二进制代码进行符号解析。
      • 符号解析的过程是将二进制代码中的符号(例如方法、属性、变量等)与相应的地址进行关联。
    • 3. 符号重定位

      • 系统会对分类和主类的二进制代码进行符号重定位。
      • 符号重定位的过程是将二进制代码中的符号地址调整为正确的地址。
    • 4. 二进制合并

      • 系统会将分类和主类的二进制代码进行合并。
      • 二进制合并的过程是将分类和主类的二进制代码合并成一个新的二进制代码。
    • 5. 加载合并后的二进制代码

      • 系统会将合并后的二进制代码加载到内存中。
      • 加载后的二进制代码包含了分类和主类的所有方法和属性,并且分类的方法和属性会覆盖主类中的同名方法和属性。