-
runTime
底層的一些常用數(shù)據(jù)結(jié)構(gòu)娱仔,比如isa
指針沐飘; -
arm64
之前,isa就是一個(gè)普通的指針牲迫,存儲(chǔ)著Class
耐朴、Meta-Class
對(duì)象的內(nèi)存地址, -
arm64
開(kāi)始盹憎,對(duì)isa進(jìn)行了優(yōu)化筛峭,變成了一個(gè)共同體union
結(jié)構(gòu),isa & ISA_MASK
才得到真實(shí)地址值陪每; 看一下底層
objc_object
:
struct objc_object {
private:
isa_t isa;// 32位的時(shí)候是 `Class` 影晓,現(xiàn)在變成了 `union`
- 64位開(kāi)始,變成了共同體;
- Class 檩禾、Meta-Class 對(duì)象的內(nèi)存地址的二進(jìn)制后3位一定是000
- 在arm64前挂签, isa 就是一個(gè)普通指針,存儲(chǔ)著Class盼产、Meta-Class對(duì)象指針饵婆;
- arm64后,使用 union 結(jié)構(gòu)戏售,將一個(gè)64位的內(nèi)存空間存儲(chǔ)了很多內(nèi)容侨核,其中的33位存儲(chǔ)著Class、Meta-Class對(duì)象指針地址值 灌灾;
union isa_t
{
Class cls;
uintptr_t bits; // 這是一個(gè) unsigned long 型搓译,
struct {
uintptr_t nonpointer : 1; // 0 代表普通的指針,存儲(chǔ)著Class紧卒、Meta-Class對(duì)象的內(nèi)存地址侥衬; 1代表優(yōu)化過(guò),使用位域存儲(chǔ)更多的信息
uintptr_t has_assoc : 1; // 是否有設(shè)置過(guò)關(guān)聯(lián)對(duì)象跑芳,如果沒(méi)有轴总,釋放時(shí)會(huì)更快
uintptr_t has_cxx_dtor : 1; // 是否有C++的析構(gòu)函數(shù),如果沒(méi)有釋放時(shí)會(huì)更快
uintptr_t shiftcls : 33; // 存儲(chǔ)著Class博个、Meta-Class 對(duì)象的內(nèi)存地址信息 MACH_VM_MAX_ADDRESS 0x1000000000
uintptr_t magic : 6; // 用于在調(diào)度時(shí)分辨對(duì)象是否未完成初始化
uintptr_t weakly_referenced : 1; // 是否有被弱引用指向過(guò)怀樟,如果沒(méi)有,釋放會(huì)更快
uintptr_t deallocating : 1; // 對(duì)象是否正在釋放
uintptr_t has_sidetable_rc : 1; // 里面存儲(chǔ)的值是引用計(jì)數(shù)器減1
uintptr_t extra_rc : 19; // 引用計(jì)數(shù)是否過(guò)大無(wú)法存儲(chǔ)在isa中盆佣; 如果為1往堡,那么引用計(jì)數(shù)會(huì)存儲(chǔ)在一個(gè)叫SideTable的類(lèi)的屬性中
# define RC_ONE (1ULL<<45)
# define RC_HALF (1ULL<<18)
};
}
- bits是大家共用的
union {
char bits; // 1個(gè)字節(jié)
} _name ;