isa的走位和类的底层结构

前言

前面我们探究了alloc对象,对象是由类alloc出来的,更确切的说是由alloc开辟空间绑定类的isa。所以对象源自于类,我们这篇文章就来探寻一下类。

一、isa

前面的探索中,一直离不开isa,首先上一张官方的isa走位和继承图

isa流程图.png
这张图中包含了继承链和isa走位,接下来我们来一一验证

1、验证继承链

首先我们创建2个类LGPersonLGDirverLGPerson继承于NSObjectLGDirver继承于LGPerson,如图:

截屏2021-06-21 下午2.13.03.png

然后打印类和元类的superClass,如图:

截屏2021-06-21 下午4.30.46.png
结果

截屏2021-06-21 下午4.32.18.png
按照结果我们画个简易的继承图:

继承链.png

是不是好像在哪看过?上面的isa走位图的右边2列就是咯!只是名字没有改。

2、验证isa链

1、方法

要验证isa的走位我们需要通过isa获取到类的指针地址,通过object_getClass我们找到了

截屏2021-06-24 下午3.17.54.png
再进入getIsa()

截屏2021-06-24 下午3.25.54.png
进入ISA()

截屏2021-06-24 下午3.29.50.png
然后在return (Class)(isa.bits & ISA_MASK);isaisa.bits是一样的,可以看我的另一篇文章传送门的结尾部分有提到。
所以获取到class的方法就是 isa & ISA_MASK,我们再来看看ISA_MASK

截屏2021-06-24 下午3.40.36.png
分为arm64x86_642种,我们跑的是mac(本人电脑非M1),所以看x86_64模式,所以ISA_MASK就是0x00007ffffffffff8,方法找清楚了我们开始干。

2、验证

我们创建实例并获取其元类根元类根根元类,打印各类及其地址,如图:

截屏2021-06-24 下午11.30.35.png
跑起来,结果如下:

截屏2021-06-24 下午11.35.01.png
这个看不出来什么,需要我们分析,用前面的方法进行分析,分析结果如图:

isa分析.png
我们用实例kcisa获取到了的地址、isa获取到了元类的地址、元类isa获取到了根元类的地址、根元类isa获取到了根根元类的地址,对比根元类根根元类的地址发现是一样的,所以画个简易的isa走位图:

未命名文件-2.png
同理可得 LGPersonisa走位图和NSObjectisa走位图都是一样的,那么合并起来,如图:

未命名文件-3.png
是不是和官方的isa走位一样?这样就验证了isa的走位。

3、走位图

我们分别验证了继承链isa的走位图,接下来我们把它们放在一起来还原官方的图:

未命名文件-4.png

二、类的结构

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享