OC的isa指针存储了哪些信息?

2020-01-04  本文已影响0人  一叶知秋0830

OC中所有的实例对象、类对象和元类对象中都一个名为isa的成员变量,他们通常把它叫isa指针,既然是指针,那里面存储的应该就是一个地址。在以前的32位系统中,isa确实就是存储的一个地址,实例对象的isa存储的是其对应的类对象的地址,类对象的isa存储的是其对应的元类对象的地址,元类对象的isa存储的是根元类对象的地址。

但是在现在的64位系统(arm64架构)中,苹果对isa做了优化,里面除了存储一个地址外还存储了很多其他信息。一个指针占8个字节,也就是64位,苹果只用了其中的33位来存储地址,其余31位用来存储其他信息。下面我们来看下在arm64架构中关于isa的定义:

#   define ISA_MASK        0x0000000ffffffff8ULL
#   define ISA_MAGIC_MASK  0x000003f000000001ULL
#   define ISA_MAGIC_VALUE 0x000001a000000001ULL
#   define ISA_BITFIELD                                                      \
      uintptr_t nonpointer        : 1;                                       \
      uintptr_t has_assoc         : 1;                                       \
      uintptr_t has_cxx_dtor      : 1;                                       \
      uintptr_t shiftcls          : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
      uintptr_t magic             : 6;                                       \
      uintptr_t weakly_referenced : 1;                                       \
      uintptr_t deallocating      : 1;                                       \
      uintptr_t has_sidetable_rc  : 1;                                       \
      uintptr_t extra_rc          : 19
#   define RC_ONE   (1ULL<<45)
#   define RC_HALF  (1ULL<<18)

上面信息中定义的像ISA_MASK这种常量我们不用管,这些都是程序在操作isa的过程中要用到的,比如我们将isaISA_MASK进行按位与运算isa & ISA_MASK就可以得到isa中存储的地址值。

我们主要关注一下uintptr_t类型数据:

上一篇 下一篇

猜你喜欢

热点阅读