返回
OC 类原理——从 Class_rw_t、Class_ro_t、Class_rw_ext_t 说起
IOS
2024-01-29 20:19:04
OC 类的底层数据结构剖析
简介
在 Objective-C(OC)中,类是编程的基本构建块。每个类都包含有关其属性、方法和其他特性的信息,这些信息存储在称为数据结构的复杂集合中。深入了解这些数据结构对于理解 OC 类的内部工作原理至关重要。
Class_rw_t、Class_ro_t 和 Class_rw_ext_t
OC 类有三种主要的数据结构:Class_rw_t、Class_ro_t 和 Class_rw_ext_t。
- Class_rw_t: 可读写的类结构,用于存储类的元数据,如方法、属性和协议。它是类的可变部分,可以随时修改。
- Class_ro_t: 只读的类结构,是对 Class_rw_t 的不可变副本。它用于优化类的查找和调用。
- Class_rw_ext_t: 可读写的类扩展结构,用于存储类的扩展信息,如分类和属性。它允许动态扩展类的功能,而无需修改原始的 Class_rw_t。
Class_rw_t
Class_rw_t 是 OC 类数据结构的中心部分。它包含以下主要成员:
- isa: 指向父类的指针,形成类的继承链。
- superclass: 父类的 Class_rw_t 指针。
- name: 类的名称。
- instanceSize: 类实例的大小。
- ivarList: 实例变量列表。
- methodList: 方法列表。
- protocolList: 协议列表。
实例方法的实现
OC 的实例方法是在运行时动态绑定的。当调用一个实例方法时,OC 会检查接收者对象的 isa 指针,它指向该对象的类。然后,它会在该类的 Class_rw_t 中查找方法的实现。如果找不到,它会继续向上搜索继承链,直到找到该方法的实现或到达根类。
代码示例
// Class_rw_t 的声明
struct Class_rw_t {
isa_t isa;
Class_rw_t *superclass;
const char *name;
long instanceSize;
ivar_list_t *ivarList;
method_list_t *methodList;
protocol_list_t *protocolList;
};
// 创建一个新的类
Class MyClass = objc_allocateClassPair(objc_getClass("NSObject"), "MyClass", 0);
结论
Class_rw_t、Class_ro_t 和 Class_rw_ext_t 是 OC 类数据结构的关键组件。它们共同提供了类的元数据、扩展信息和只读副本。理解这些结构对于掌握 OC 类的底层实现至关重要。
常见问题解答
- Class_rw_t 和 Class_ro_t 有什么区别?
Class_rw_t 是可读写的类结构,而 Class_ro_t 是它的不可变副本,用于优化查找和调用。 - Class_rw_ext_t 用于什么?
Class_rw_ext_t 用于存储类的扩展信息,如分类和属性,从而动态扩展类的功能。 - 实例方法是如何绑定的?
实例方法是在运行时动态绑定的,通过检查接收者对象的 isa 指针并向上搜索继承链来查找方法的实现。 - Class_rw_t 中的 isa 指针有什么用?
isa 指针指向类的父类,形成类的继承链。 - OC 中的 isa 指针和 C++ 中的 vtable 有什么区别?
isa 指针在 OC 中扮演着类似于 C++ 中 vtable 的角色,它指向一个结构,该结构包含指向类方法实现的指针。