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中

实例对象的内存布局
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 |
网友评论