返回

isa的走位和类的底层结构

IOS

前言

在前文探索中,我们了解了alloc和对象,其中对象是由类alloc出来的,更确切地说,是由alloc开辟空间绑定类的isa。因此,对象源自于类。本文将深入探讨类的内部结构,重点分析isa的走位。

一、isa

在之前的探索中,我们发现isa无处不在。

  • 类对象 :类对象(Class)指向类的isa指向类元数据(Meta-class)
  • 对象 :对象指向类的isa指向类的类元数据(Meta-class)

isa的作用是将类与类元数据(Meta-class)关联起来,类元数据记录了类的元信息,比如类的名字、父类、实例变量列表、方法列表等。

isa的偏移地址

在64位系统中,isa的偏移地址为8个字节,即0x8。

isa的结构

struct isa_t {
  Class superclass;
  Class isa;
  uint32_t reserved;
}
  • superclass:指向父类的isa指针
  • isa:指向类的元数据的isa指针
  • reserved:保留字段

二、类的底层结构

类的内存布局

一个类在内存中的布局如下:

// 类对象
+-------------------------+
| 类名 | isa | 父类 | 实例变量列表 | 方法列表 |
+-------------------------+

// 对象
+-------------------------+
| isa | 实例变量列表 |
+-------------------------+

类的偏移地址

在64位系统中,类的偏移地址如下:

  • 类名:0x10
  • isa:0x8
  • 父类:0x18
  • 实例变量列表:0x20
  • 方法列表:0x30

类的指针运算

获取类名

const char *className = ((Class)isa)->name;

获取父类

Class superclass = ((Class)isa)->superclass;

获取实例变量列表

Class class = ((Class)isa)->isa;
ivar_list_t *vars = ((Class)class)->ivars;

获取方法列表

Class class = ((Class)isa)->isa;
method_list_t *methods = ((Class)class)->methods;

三、总结

通过深入理解isa的走位和类的底层结构,开发者可以更深入地掌握Objective-C的底层实现原理,从而提升代码优化和故障排查能力。