Runtime - 2.0 内存模型

我们先来看一下 object 和 class 之间的关系


Runtime - 2.0 内存模型_第1张图片
objc_class

从上图中我们可以看到几个点

  • 实例对象 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 中寻找

你可能感兴趣的:(Runtime - 2.0 内存模型)