04.ISA与Class

本文基于 objc4-818.2 源码

本文较长,建议吃饱喝足再进行阅读。由于很多内容关联性很强,本来准备拆分一下的。但还是决定放在一起,逐步深入。避免发生 这里一个知识点在另一篇文章,那我晚点再看(根本不会再看) 的情况。

其中 协议列表 的探究过程中遇到了一些问题,无法进行下去,有解决办法的欢迎交流~

一、类对象

在上一文中我们初步探究了,obj和isa.

通过下面的步骤我们可以找到类对象

(lldb) p/x obj1
(RYObject *) $8 = 0x000000028026c340
(lldb) x/4gx 0x000000028026c340
0x28026c340: 0x000001a1042194f1 0x0000000000000000
0x28026c350: 0x0000b6106e0ac350 0x000000028356012e
(lldb) p/x 0x000001a1042194f1 & 0x0000000ffffffff8ULL
(unsigned long long) $14 = 0x00000001042194f0
(lldb) po 0x000001a1042194f1 & 0x0000000ffffffff8ULL
RYObject

1.1 类对象ISA

Class其实也是一个对象,那么我很好奇。类对象是不是也有个ISA呢?

我们以同样的步骤进行调试:

居然也有一个RYObject,并且内存地址和第一步生成的0x00000001042194f0 不一样,是0x00000001042194c8

这里的0x00000001042194c8其实就是元类

二、元类

我们将刚才编译过的MachO丢进MachoView中解析。

打开符号表,搜索RYObject

1
  • _OBJC_METACLASS_RO$_RYObject

    • 元类

  • _OBJC_CLASS_RO$_RYObject

三、ISA与Class的关系

我们使用下面的代码进行验证,其中RYSubObject继承RYObject

依次得到输出如下

3.1 子类ISA

RYSubObject

子类实例对象 -isa- 子类 -isa- 子类元类 -isa- 根元类

3.2 父类ISA

RYObject

实例对象 -isa--isa- 元类 -isa- 根元类

3.3 根类ISA

NSObject

根类实例对象 -isa- 根类 -isa- 根元类 -isa- 根元类

3.4 ISA关系图

我们将上面的三组关系整合一下

ISA

3.5 类继承关系

子类 -继承- 父类 -继承- 根类 -继承-

3.6 元类继承关系

这里发现 根元类NSObject(地址0x1fc9421f0) 的父类是 根类(地址0x1fc942218)

子类的元类 -继承- 父类的元类 -继承- 根元类 -继承- 根类

3.7 ISA与Class的继承关系图梳理

ISA与Class

Last updated

Was this helpful?