Objective-C的内存布局
2019-02-13 本文已影响0人
xiny123
Objective-C的内存布局
在Objective-C中任何的类定义都是对象。即在程序启动的时候任何类定义都对应一块内存。在编译的时候,编译器会给每一个类生成一个且只生成一个“描述其定义的对象”,也就是类对象(class object),它是一个单列(singleton),而我们在C++等语言中所谓的对象,叫做实例对象(instance object)。对于实例对象我们不难理解,但类对象(class object)是什么呢?我们知道Objective-C是门动态的语言,因此程序里的所有实例对象(instance object)都是运行时由Objective-C的运行时库生成的,而这个类对象(class object)就是运行时库用来创建实例对象(instance object)的依据。
任何直接或间接继承了NSObject的类,它的实例对象(instance object)中都有一个isa指针,指向它的类对象(class object)。这个类对象中存储了关于这个实例对象(instance object)所属的类结构信息,包括定义的方法,遵守的协议等等。
以上可以看到如果要讨论OC中的内部布局,就要讨论两种布局:实例对象的内存布局、实例对象所属的类对象(class)的内存布局。
- 实例变量(包括父类) 都保存在对象本身的存储空间内;
- 本类的实例方法 保存在类对象中
- 本类的类方法 保存在元类对象中
- 父类的实例方法 保存在各级super class中
- 父类的类方法 保存在各级super meta class中
20180103192707634.png
实例对象的内存布局
isa指向其类对象,其余空间保存各级的ivar
| ISA pointer |
|---|
| Root class's ivars |
| Penultimate superclass's ivars |
| ... |
| Super class's ivars |
| Class's ivars |
类对象的内存布局
(详细可看 runtime.h 中对 objc_class 的定义),isa 指向其元类,super_class指向其父类,此外还包含实例变量列表、方法列表、协议列表:
| isa |
|---|
| supre class |
| class name |
| ivars list |
| methods list |
| protocols list |
| others |