Runtime - 2.0 内存模型
2021-05-12 本文已影响0人
ienos
我们先来看一下 object 和 class 之间的关系
![](https://img.haomeiwen.com/i1929662/303faf67e9e7bf73.png)
从上图中我们可以看到几个点
- 实例对象 instance.isa 指向 class
- class.isa 指向 meta_class
- meta_class.isa 指向 meta_class(root_class)
- meta_class.superclass 指向 root_class
- root_class.superclass 指向 nil
- meta_class.superclass 为 class.superclass.mateclass
- root_class 指的就是 NSObject
一、类对象
objc_class 继承 objc_object,可以看出类本身也是一个对象
struct objc_class : objc_object {
// Class ISA;
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
...
}
二、实例对象
struct objc_object {
private:
isa_t isa;
...
}
三、isa
isa 就是一个指针
- 实例对象的 isa 指向 类对象
- 类对象的 isa 指向 meta 类
- meta 类的 isa 指向 root_meta 类
四、metaclass
- class 中保存着实例对象的方法
- metaclass 中保存着类对象的方法
当对一个实例对象发送一个消息时,会通过该实例对象的 isa 指针找到该实例对象的类,然后在类中找到对应的实例对象的方法;如果找不到方法,会去到 isa 指针的 superclass 中寻找