前言
前面我们探究了alloc和对象,对象是由类alloc出来的,更确切的说是由alloc开辟空间绑定类的isa。所以对象源自于类,我们这篇文章就来探寻一下类。
一、isa
前面的探索中,一直离不开isa,首先上一张官方的isa走位和继承图
这张图中包含了继承链和isa
走位,接下来我们来一一验证
1、验证继承链
首先我们创建2个类LGPerson
和LGDirver
,LGPerson
继承于NSObject
,LGDirver
继承于LGPerson
,如图:
然后打印类和元类的superClass
,如图:
结果
按照结果我们画个简易的继承图:
是不是好像在哪看过?上面的isa
走位图的右边2列就是咯!只是名字没有改。
2、验证isa链
1、方法
要验证isa
的走位我们需要通过isa
获取到类的指针地址,通过object_getClass
我们找到了
再进入getIsa()
进入ISA()
然后在return (Class)(isa.bits & ISA_MASK);
,isa
和isa.bits
是一样的,可以看我的另一篇文章传送门的结尾部分有提到。
所以获取到class
的方法就是 isa & ISA_MASK
,我们再来看看ISA_MASK
分为arm64
和x86_64
2种,我们跑的是mac(本人电脑非M1),所以看x86_64
模式,所以ISA_MASK
就是0x00007ffffffffff8
,方法找清楚了我们开始干。
2、验证
我们创建实例并获取其类
、元类
、根元类
、根根元类
,打印各类及其地址,如图:
跑起来,结果如下:
这个看不出来什么,需要我们分析,用前面的方法进行分析,分析结果如图:
我们用实例kc
的isa
获取到了类
的地址、类
的isa
获取到了元类
的地址、元类
的isa
获取到了根元类
的地址、根元类
的isa
获取到了根根元类
的地址,对比根元类
和根根元类
的地址发现是一样的,所以画个简易的isa
走位图:
同理可得 LGPerson
的isa
走位图和NSObject
的isa
走位图都是一样的,那么合并起来,如图:
是不是和官方的isa
走位一样?这样就验证了isa
的走位。
3、走位图
我们分别验证了继承链
和isa
的走位图,接下来我们把它们放在一起来还原官方的图: