arm64 架構開始,變成了一個共用體結構,還使用位域來儲存更多的資訊
union isa_t
{
Class cls;
uintptr_t bits;
struct {
uintptr_t nonpointer: 1;
uintptr_t has_assoc: 1;
uintptr_t has_cxx_dtor: 1;
uintptr_t shiftcls: 33;
uintptr_t magic: 6;
uintptr_t weakly_referenced: 1;
uintptr_t deallocating: 1;
uintptr_t has_sidetable_rc: 1;
uintptr_t extra_rc: 19;
}
}
複製程式碼
-
nonpointer
- 0,代表普通指標,儲存著 Class、Meta-Class 物件的記憶體地址
- 1,代表優化過,使用位域儲存更多的資訊
-
has_assoc
- 是否有設定關聯物件,如果沒有,釋放時會更快
-
has_cxx_dtor
- 是否有 c++ 的解構函式,如果沒有,釋放會更快
-
shiftcls
- 儲存著 Class、Meta-Class物件的記憶體地址資訊
-
magic
- 用於在除錯時分辨物件是否未完成初始化
-
weakly_referenced
- 是否有被弱引用指向過,如果沒有,釋放時會更快
-
deallocating
- 是否正在釋放
-
extra_rc
- 裡面儲存的值是引用計數器減1
-
has_sidetable_rc
- 引用計數器是否過大無法儲存在 isa 中
- 如果為1,那麼引用計數會儲存在一個叫 SideTable 的類的屬性中
所以 isa 需要進行一次位運算,才能取出物件的真實地址值
#define ISA_MASK 0x0000000ffffffff8ULL
isa.bits & ISA_MASK
複製程式碼
所以所有物件的地址後三位都是0