isa详解
2019-12-20 本文已影响0人
海浪萌物
接上一篇文章
一、isa初始化流程
image.png我们可以看大在alloc时候会将类右移三位后保存在isa.shiftcls里面
首先我们发现object_getClass函数其实就是去除对象的isa功能 image.png进到getIsa函数 image.png
因为主要都是走第一行 if (!isTaggedPointer()) return ISA()
我们进到ISA()函数中看看
image.png
我们看到 image.png
SUPPORT_INDEXED_ISA一般都是0,所以返回的是 image.png
我们在看下isa的结构
image.png
其中ISA_MASK的值是
image.png
这是从isa指针中取出类对象
验证流程:
1576770136344.jpg我们先通过x/4gx object 命令拿到object对象的前4个属性的内存地址,首先我们确定的是对象的第一个属性必然是isa,因为所以对象都是继承NSObject,NSObject里面第一个就是isa成员变量 image.png
在上面我们发现取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
我们会发现得到的两个值是一样的