isa指针
从runtime源码来看:runtime源码
在arm64位之前,isa指针就是一个普通的指针,储存这Class跟metaClass对象的内存地址,之后对isa进行了优化,变成了一个(union)结构,还使用位域来存储更多信息。
arm64 之后instance获取到class的isa指针的话需要加上一个掩码,具体掩码的值可以在runtime文档中<objc-private.h>中查看ISA_MASK 的宏,这样做的目的就是可以提升运行速率,节省内存开支,(本来是需要用三个bool变量来记录,现在只要一个字节的char就可以达到效果)我们用下面的图片来说明下位域的用法
下面我们可以使用位域的技术更加精简,我们设定一个结构体来储存我们的值。
运用联合体union可以是内部变量共用一块内存,class内部就是使用的union来存储 isa 指针
所以取值isa地址的时候需要& ISA_MASK才能得到真正的isa地址
shiftcls 是存放class meta-class的地址,位移33位。