iOS 如何获取真正isa指针的地址

isa指针

从runtime源码来看:runtime源码

isa指针底层结构

在arm64位之前,isa指针就是一个普通的指针,储存这Class跟metaClass对象的内存地址,之后对isa进行了优化,变成了一个(union)结构,还使用位域来存储更多信息。

arm64 之后instance获取到class的isa指针的话需要加上一个掩码,具体掩码的值可以在runtime文档中中查看ISA_MASK 的宏,这样做的目的就是可以提升运行速率,节省内存开支,(本来是需要用三个bool变量来记录,现在只要一个字节的char就可以达到效果)我们用下面的图片来说明下位域的用法


位运算的用法

下面我们可以使用位域的技术更加精简,我们设定一个结构体来储存我们的值。

联合体union

运用联合体union可以是内部变量共用一块内存,class内部就是使用的union来存储 isa 指针

isa指针内部联合体

所以取值isa地址的时候需要& ISA_MASK才能得到真正的isa地址
shiftcls 是存放class meta-class的地址,位移33位。

isa union中的变量作用

isa内部变量作用

你可能感兴趣的:(iOS 如何获取真正isa指针的地址)