Runtime備忘-isa

小星星_ios發表於2020-03-21

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