返回
iOS 底层:类的加载之旅(中)
IOS
2023-11-26 06:20:12
iOS 底层探索:类的加载(中)
在上一篇文章《iOS 底层:类的加载(上)》中,我们揭开了类的加载过程的神秘面纱,这次我们将继续深入探讨这个主题,并揭示更多关于类加载的奥秘。
知识点补充
为了更好地理解接下来的内容,让我们先回顾一下一些重要的知识点:
- 方法交换: 一种在运行时修改方法实现的技术,允许我们动态地修改类的行为。
- 方法决议: 在 Objective-C 中,方法决议过程确定要调用哪个方法实现,基于接收者的类和方法选择器。
- 类层次结构: Objective-C 采用单根类层次结构,其中每个类都继承自
NSObject
。
Realize Class Without Swift
在 realizeClassWithoutSwift
方法中,类加载过程继续以下步骤:
- 分配并初始化类对象: 分配一个结构体来表示类对象,并使用
objc_allocateClassPair
为该类对象分配内存。 - 设置类信息: 将类的名称、父类和实例大小等信息存储在类对象中。
- 添加类方法: 使用
class_addMethod
为类添加类方法。 - 添加实例方法: 使用
class_addMethod
为类添加实例方法。 - 设置类元类: 将类的类元类设置为指向自身。
- 注册类: 使用
objc_registerClassPair
注册类,使其可用于 Objective-C 运行时。
方法决议的魔术
方法决议是一个复杂的流程,它使用以下规则确定要调用的方法实现:
- 静态分派: 如果方法调用出现在编译时已知的上下文中,则编译器将直接调用相应的方法实现。
- 动态分派: 如果方法调用出现在运行时未知的上下文中,则运行时将查找并调用适当的方法实现。
- 覆盖: 如果子类重写了父类的方法,则将调用子类的实现。
代码示例
以下代码示例演示了如何使用 realizeClassWithoutSwift
方法创建一个自定义类:
Class customClass = objc_allocateClassPair([NSObject class], "CustomClass", 0);
class_addMethod(customClass, @selector(init), (IMP)customClassInit, "v@:");
objc_registerClassPair(customClass);
结论
类加载是 Objective-C 运行时的一个核心概念,了解这一过程对于理解 iOS 底层至关重要。通过了解 realizeClassWithoutSwift
方法和方法决议的机制,我们已经深入探讨了类加载的内部运作原理。在下一篇文章中,我们将继续我们的旅程,探索动态类型和消息发送的奥秘。