返回

iOS 底层:类的加载之旅(中)

IOS

iOS 底层探索:类的加载(中)

在上一篇文章《iOS 底层:类的加载(上)》中,我们揭开了类的加载过程的神秘面纱,这次我们将继续深入探讨这个主题,并揭示更多关于类加载的奥秘。

知识点补充

为了更好地理解接下来的内容,让我们先回顾一下一些重要的知识点:

  • 方法交换: 一种在运行时修改方法实现的技术,允许我们动态地修改类的行为。
  • 方法决议: 在 Objective-C 中,方法决议过程确定要调用哪个方法实现,基于接收者的类和方法选择器。
  • 类层次结构: Objective-C 采用单根类层次结构,其中每个类都继承自 NSObject

Realize Class Without Swift

realizeClassWithoutSwift 方法中,类加载过程继续以下步骤:

  1. 分配并初始化类对象: 分配一个结构体来表示类对象,并使用 objc_allocateClassPair 为该类对象分配内存。
  2. 设置类信息: 将类的名称、父类和实例大小等信息存储在类对象中。
  3. 添加类方法: 使用 class_addMethod 为类添加类方法。
  4. 添加实例方法: 使用 class_addMethod 为类添加实例方法。
  5. 设置类元类: 将类的类元类设置为指向自身。
  6. 注册类: 使用 objc_registerClassPair 注册类,使其可用于 Objective-C 运行时。

方法决议的魔术

方法决议是一个复杂的流程,它使用以下规则确定要调用的方法实现:

  1. 静态分派: 如果方法调用出现在编译时已知的上下文中,则编译器将直接调用相应的方法实现。
  2. 动态分派: 如果方法调用出现在运行时未知的上下文中,则运行时将查找并调用适当的方法实现。
  3. 覆盖: 如果子类重写了父类的方法,则将调用子类的实现。

代码示例

以下代码示例演示了如何使用 realizeClassWithoutSwift 方法创建一个自定义类:

Class customClass = objc_allocateClassPair([NSObject class], "CustomClass", 0);
class_addMethod(customClass, @selector(init), (IMP)customClassInit, "v@:");
objc_registerClassPair(customClass);

结论

类加载是 Objective-C 运行时的一个核心概念,了解这一过程对于理解 iOS 底层至关重要。通过了解 realizeClassWithoutSwift 方法和方法决议的机制,我们已经深入探讨了类加载的内部运作原理。在下一篇文章中,我们将继续我们的旅程,探索动态类型和消息发送的奥秘。