返回
isa的走位和类的底层结构
IOS
2023-10-10 08:45:42
前言
在前文探索中,我们了解了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的底层实现原理,从而提升代码优化和故障排查能力。