johnhao
johnhao
发布于 2017-07-01 / 2 阅读
0

iOS-OC对象的本质

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 元类对象

类型

本质

isa 指向

实例对象(如 [[NSObject alloc] init]

objc_object

所属的类(如 NSObject

类对象(如 [NSObject class]

objc_class

对应的元类(metaclass)

元类对象

objc_class

根元类(root metaclass),最终指向 NSObject


5. 总结:OC 对象的本质

  • OC 对象 = 指向结构体的指针

  • 结构体首字段 = isa 指针

  • isa 指向类(或元类)

  • 所有消息传递、方法调用、继承、多态等机制都依赖于 isa 和类结构

这种设计使得 Objective-C 具备强大的动态性(dynamic typing, dynamic binding, introspection),也是其 Runtime 系统的基础。