搜索isa隙券,尋找發(fā)現(xiàn)
# if __arm64__
// ARM64 simulators have a larger address space, so use the ARM64e
// scheme even when simulators build for ARM64-not-e.
# if __has_feature(ptrauth_calls) || TARGET_OS_SIMULATOR
# define ISA_MASK 0x007ffffffffffff8ULL
# define ISA_MAGIC_MASK 0x0000000000000001ULL
# define ISA_MAGIC_VALUE 0x0000000000000001ULL
# define ISA_HAS_CXX_DTOR_BIT 0
# define ISA_BITFIELD \
uintptr_t nonpointer : 1; \
uintptr_t has_assoc : 1; \
uintptr_t weakly_referenced : 1; \
uintptr_t shiftcls_and_sig : 52; \
uintptr_t has_sidetable_rc : 1; \
uintptr_t extra_rc : 8
# define RC_ONE (1ULL<<56)
# define RC_HALF (1ULL<<7)
# else
# define ISA_MASK 0x0000000ffffffff8ULL
# define ISA_MAGIC_MASK 0x000003f000000001ULL
# define ISA_MAGIC_VALUE 0x000001a000000001ULL
# define ISA_HAS_CXX_DTOR_BIT 1
# define ISA_BITFIELD \
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 unused : 1; \
uintptr_t has_sidetable_rc : 1; \
uintptr_t extra_rc : 19
# define RC_ONE (1ULL<<45)
# define RC_HALF (1ULL<<18)
# endif
# elif __x86_64__
# define ISA_MASK 0x00007ffffffffff8ULL
# define ISA_MAGIC_MASK 0x001f800000000001ULL
# define ISA_MAGIC_VALUE 0x001d800000000001ULL
# define ISA_HAS_CXX_DTOR_BIT 1
# define ISA_BITFIELD \
uintptr_t nonpointer : 1; \
uintptr_t has_assoc : 1; \
uintptr_t has_cxx_dtor : 1; \
uintptr_t shiftcls : 44; /*MACH_VM_MAX_ADDRESS 0x7fffffe00000*/ \
uintptr_t magic : 6; \
uintptr_t weakly_referenced : 1; \
uintptr_t unused : 1; \
uintptr_t has_sidetable_rc : 1; \
uintptr_t extra_rc : 8
# define RC_ONE (1ULL<<56)
# define RC_HALF (1ULL<<7)
# else
# error unknown architecture for packed isa
# endif
原來(lái)isa并不是單純的存地址,而是存了好多信息。其中
nonpointer:表示是否對(duì) isa 指針開(kāi)啟指針優(yōu)化
0:純isa指針,1:不?是類(lèi)對(duì)象地址,isa 中包含了類(lèi)信息、對(duì)象的引?計(jì)數(shù)等
has_assoc:關(guān)聯(lián)對(duì)象標(biāo)志位倍踪,0沒(méi)有,1存在
has_cxx_dtor:該對(duì)象是否有 C++ 或者 Objc 的析構(gòu)器,如果有析構(gòu)函數(shù),則需要做析構(gòu)邏輯,
如果沒(méi)有,則可以更快的釋放對(duì)象
shiftcls:存儲(chǔ)類(lèi)指針的值索昂。開(kāi)啟指針優(yōu)化的情況下建车,在 arm64 架構(gòu)中有 33 位?來(lái)存儲(chǔ)類(lèi)指針。
magic:?于調(diào)試器判斷當(dāng)前對(duì)象是真的對(duì)象還是沒(méi)有初始化的空間
weakly_referenced:志對(duì)象是否被指向或者曾經(jīng)指向?個(gè) ARC 的弱變量椒惨,
沒(méi)有弱引?的對(duì)象可以更快釋放缤至。
deallocating:標(biāo)志對(duì)象是否正在釋放內(nèi)存
has_sidetable_rc:當(dāng)對(duì)象引?技術(shù)?于 10 時(shí),則需要借?該變量存儲(chǔ)進(jìn)位
extra_rc:當(dāng)表示該對(duì)象的引?計(jì)數(shù)值康谆,實(shí)際上是引?計(jì)數(shù)值減 1凄杯,
例如,如果對(duì)象的引?計(jì)數(shù)為 10秉宿,那么 extra_rc 為 9戒突。如果引?計(jì)數(shù)?于 10,則需要使?到上? has_sidetable_rc描睦。
isa64情況.jpeg
isa存儲(chǔ)圖如上:
示例:
isa = 0x011d800100008369 和上圖倒過(guò)來(lái)看
在x86_64中
extra_rc = 00000001
has_sidetable_rc = 0
deallocating = 0
weakly_referenced = 0
magic = 110110
isa指向地址 = 0x011d800100008369 & 0x00007ffffffffff8
has_assoc = 0
has_cxx_dtor = 0
nonpointer = 1