在arm64架構(gòu)之前盖呼,isa就是一個普通的指針,存儲著Class、Meta-Class對象的內(nèi)存地址涕刚。
在Runtime源碼中可以看到
/// Represents an instance of a class.
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
從arm64架構(gòu)開始,對isa進行了優(yōu)化乙帮,變成了一個共用體(unit)結(jié)構(gòu)杜漠,還使用位域來存儲更多的信息
在Runtime源碼中可以看到
struct objc_object {
private:
isa_t isa;
}
//共用體中可以定義多個成員,共用體的大小由最大的成員大小決定
//共用體的成員公用一個內(nèi)存
//對某一個成員賦值察净,會覆蓋其他成員的值
//存儲效率更高
union isa_t
{
isa_t() { }
isa_t(uintptr_t value) : bits(value) { }
Class cls;
uintptr_t bits; //存儲下面結(jié)構(gòu)體每一位的值
#if SUPPORT_PACKED_ISA
# if __arm64__
# define ISA_MASK 0x0000000ffffffff8ULL
# define ISA_MAGIC_MASK 0x000003f000000001ULL
# define ISA_MAGIC_VALUE 0x000001a000000001ULL
struct {
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)
};
}
nonpointer
表示是否對 isa 指針開啟指針優(yōu)化
0:表示普通指針驾茴,存儲著Class、Meta-Class對象的內(nèi)存地址
1:表示優(yōu)化過的指針氢卡,使用位域存儲更多的信息锈至,包含是否有關(guān)聯(lián)對象、對象的引用計數(shù)异吻、是否有弱引用裹赴、是否使用C++代碼等等喜庞。
has_assoc
關(guān)聯(lián)對象標(biāo)志位,0沒有棋返,1存在
是否有設(shè)置過關(guān)聯(lián)對象延都,關(guān)聯(lián)對象被取消,值任然為1
has_cxx_dtor
是否有C++的析構(gòu)函數(shù) 0 沒有,對象釋放時會更快 1 有 需要做析構(gòu)的邏輯處理
shiftcls
存儲著Class睛竣、Meta-Class對象的內(nèi)存地址
magic
用于調(diào)試器判斷當(dāng)前對象是真的對象還是沒有初始化的空間
weakly_referenced
是否設(shè)置過被弱引用指向過 0 沒有晰房,對象釋放時會更快 1 有,對象釋放時射沟,runtime會將所以指向該對象的弱引用置為nil,
只要被弱引用指向過殊者,其值就是1
deallocating
標(biāo)志對象是否正在釋放內(nèi)存
has_sidetable_rc
是否有外掛的引用計數(shù)表, 0 沒有 1 有验夯,當(dāng)對象的引用計數(shù)大于10是猖吴,則需要外掛引用計數(shù)表來管理對象
extra_rc
存儲對象的引用計數(shù),值為引用計數(shù)器減一挥转,因為在獲取對象的引用計數(shù)的方法中海蔽,系統(tǒng)會做加一處理。