前面我們知道在arm64位之后實(shí)例對(duì)象的isa指針&ISA_MASK之后是指向class類(lèi)對(duì)象阔涉,class類(lèi)對(duì)象的isa指針&ISA_MASK之后指向meta-class元類(lèi)對(duì)象庭敦。在arm64位之前isa指針就是單純的指向class類(lèi)對(duì)象或者meta-class元類(lèi)對(duì)象
我們知道OC對(duì)象的本質(zhì)就是一個(gè)結(jié)構(gòu)體在arm64位之后是這樣:
struct objc_object {
isa_t isa;//isa指針
}
發(fā)現(xiàn)這個(gè)isa指針是一個(gè)isa_t結(jié)構(gòu)體:
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; // 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;
};
}
isa_t是一個(gè)共用體排惨,并且使用位域來(lái)存儲(chǔ)更多信息惰帽。注:(通過(guò)bits&XX_MASK可以取出位域中對(duì)應(yīng)的值)
(1)nonpointer:0代表普通的指針吗讶,存儲(chǔ)著Class棋枕、Meta-Class對(duì)象的內(nèi)存地址吗铐;1代表優(yōu)化過(guò)材部,使用位域存儲(chǔ)更多信息
(2)has_assoc:是否有設(shè)置過(guò)關(guān)聯(lián)對(duì)象毫缆,如果沒(méi)有,釋放時(shí)會(huì)更快
(3)has_cxx_dtor:是否有C++的析構(gòu)函數(shù)乐导,如果沒(méi)有苦丁,釋放時(shí)會(huì)更快
(4)shiftcls:存儲(chǔ)著Class、Meta-Class對(duì)象的內(nèi)存地址信息
(5)magic:用于調(diào)試時(shí)分辨對(duì)象是否未完成初始化
(6)weakly_referenced:是否有被弱引用指向過(guò)物臂,如果沒(méi)有旺拉,釋放時(shí)會(huì)更快
(7)deallocating:對(duì)象是否正在釋放
(8)extra_rc:里面存儲(chǔ)的值是引用計(jì)數(shù)值
(9)has_sidetable_rc:引用計(jì)數(shù)器是否過(guò)大無(wú)法存儲(chǔ)在isa中,如果為1棵磷,那么引用計(jì)數(shù)會(huì)存儲(chǔ)在一個(gè)叫SideTable的類(lèi)的屬性中
所以isa& ISA_MASK其實(shí)就是取出位域中shiftcls的值蛾狗,由此得到Class、Meta-Class對(duì)象的內(nèi)存地址