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
RYObject1.1 类对象ISA
Class其实也是一个对象,那么我很好奇。类对象是不是也有个ISA呢?
我们以同样的步骤进行调试:
居然也有一个RYObject,并且内存地址和第一步生成的0x00000001042194f0 不一样,是0x00000001042194c8。
这里的0x00000001042194c8其实就是元类。
二、元类
我们将刚才编译过的MachO丢进MachoView中解析。
打开符号表,搜索RYObject:

_OBJC_METACLASS_RO$_RYObject
元类
_OBJC_CLASS_RO$_RYObject
类
三、ISA与Class的关系
我们使用下面的代码进行验证,其中RYSubObject继承RYObject
依次得到输出如下
3.1 子类ISA

子类实例对象
-isa-子类-isa-子类元类-isa-根元类
3.2 父类ISA

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

根类实例对象
-isa-根类-isa-根元类-isa-根元类
3.4 ISA关系图
我们将上面的三组关系整合一下

3.5 类继承关系
子类
-继承-父类-继承-根类-继承-空
3.6 元类继承关系
这里发现 根元类NSObject(地址0x1fc9421f0) 的父类是 根类(地址0x1fc942218)
子类的元类
-继承-父类的元类-继承-根元类-继承-根类
3.7 ISA与Class的继承关系图梳理

Last updated
Was this helpful?