一、isa源码分析
上一篇我们分析道initIsa方法,这篇我们来探究一下isa,首先我们先看一下initIsa方法内容

最后一句代码意思是将cls通过右移3位的形式保存在bits里面
为了具体一点,我们先看一下如何从isa里面渠道类名的,首先我们看一下object_getClass函数的实现

进到getIsa函数

因为主要都是走第一行,我们进到ISA()函数中看看

我们看到

SUPPORT_INDEXED_ISA一般都是0,所以返回的是

我们在看下isa的结构

其中ISA_MASK的值是

这就是是从isa指针中取出类对象的方式
二、验证过程
我们通过LLDB方式依照源码的原理进行取值

我们先通过x/4gx object命令拿到object对象的前4个属性的内存地址,首先我们确定的是对象的第一个属性必然是isa,因为所以对象都是继承NSObject,NSObject里面第一个就是isa成员变量

在上面我们发现取isa时候是isa.bits & ISA_MASK
我们拿取到的isa地址和ISA_MASK与一下得到结果:
(lldb) p/x 0x001d800100001131 & 0x00007ffffffffff8ULL
(unsigned long long) $1 = 0x0000000100001130
然后再拿到object类的地址
(lldb) p/x LGPerson.class
(Class) $2 = 0x0000000100001130 LGPerson
我们会发现得到的两个值是一样的,所以我们确定类的信息保存在isa的bit里面并且通过&0x00007ffffffffff8ULL就能得到