Objective-C的内存布局

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)的内存布局。

  1. 实例变量(包括父类) 都保存在对象本身的存储空间内;
  2. 本类的实例方法 保存在类对象中
  3. 本类的类方法 保存在元类对象中
  4. 父类的实例方法 保存在各级super class中
  5. 父类的类方法 保存在各级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

你可能感兴趣的:(Objective-C的内存布局)