OC(Objective-C)对象的本质可以从底层实现的角度来理解。在 Objective-C 中,对象本质上是一个结构体(struct)的指针,这个结构体的第一个成员是 isa 指针,用于指向该对象所属的类(Class)。这是 Runtime 系统识别和操作对象的关键。
1. 对象的底层结构
在 Objective-C 的 Runtime 源码中,对象的基本结构定义如下(简化版):
struct objc_object {
Class isa;
};
objc_object是所有 OC 对象的底层表示。isa是一个指向Class类型(即objc_class结构体)的指针。所有 OC 对象(如
NSObject *obj)在底层都是objc_object *类型。
2. Class 的本质
Class 本身也是一个对象(元类机制),其底层结构大致如下(简化):
struct objc_class {
Class isa; // 指向元类(metaclass)
Class superclass; // 父类
cache_t cache; // 方法缓存
class_data_bits_t bits; // 存储方法、属性、协议等信息
};
每个类(如
NSObject)在运行时都对应一个objc_class结构体实例。类对象的
isa指向它的元类(metaclass),用于支持类方法的调用。
3. isa 指针的作用
isa是对象与类之间的桥梁。当你向一个对象发送消息(如
[obj doSomething]),Runtime 会通过obj->isa找到对应的类,然后在类的方法列表中查找doSomething方法。在 64 位架构下,
isa是经过优化的 共用体(union),除了指向类,还包含一些标志位(如是否使用了关联对象、是否有弱引用等),以节省内存和提高性能。
4. 实例对象 vs 类对象 vs 元类对象
5. 总结:OC 对象的本质
OC 对象 = 指向结构体的指针
结构体首字段 = isa 指针
isa 指向类(或元类)
所有消息传递、方法调用、继承、多态等机制都依赖于 isa 和类结构
这种设计使得 Objective-C 具备强大的动态性(dynamic typing, dynamic binding, introspection),也是其 Runtime 系统的基础。