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

我们会发现得到的两个值是一样的

上一篇下一篇

猜你喜欢

热点阅读