id
是指向一個類的實(shí)例對象的指針欢瞪。
/// A pointer to an instance of a class.
typedef struct objc_object *id;
類的底層定義
typedef struct objc_class *Class;
struct objc_class : objc_object {
// Class ISA;
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
class_rw_t *data() const {
return bits.data();
}
//……
}
對象的底層定義,類繼承自objc_object
吃挑,所以類也是對象,類對象街立。
ISA() assumes this is NOT a tagged pointer object
假設(shè)這不是tagged pointer object舶衬,因?yàn)?a href="http://www.reibang.com/p/466e63a008ff" target="_blank">TaggedPointer沒有isa指針
struct objc_object {
private:
isa_t isa;
public:
// ISA() assumes this is NOT a tagged pointer object
Class ISA();
// rawISA() assumes this is NOT a tagged pointer object or a non pointer ISA
Class rawISA();
// getIsa() allows this to be a tagged pointer object
Class getIsa();
//……
}
OC對象的本質(zhì),每個OC對象都含有一個isa
指針赎离,64位之前逛犹,isa
僅僅是一個指針,保存著對象或類對象內(nèi)存地址梁剔,在64位架構(gòu)之后虽画,apple對isa
進(jìn)行了優(yōu)化,叫做nonpointer_isa
荣病,變成了一個共用體(union)結(jié)構(gòu)码撰,同時使用位域來存儲更多的信息。
union isa_t {
isa_t() { }
isa_t(uintptr_t value) : bits(value) { }
Class cls;
uintptr_t bits;
#if defined(ISA_BITFIELD)
struct {
//ISA_BITFIELD; // defined in isa.h
# if __arm64__
//表示是否對isa開啟指針優(yōu)化 个盆。0代表是純isa指針脖岛,1代表除了地址外,還包含了類的一些信息颊亮、對象的引用計(jì)數(shù)等柴梆。
uintptr_t nonpointer : 1; \
//是否有關(guān)聯(lián)對象
uintptr_t has_assoc : 1; \
//是否有C++或Objc的析構(gòu)器,如果有析構(gòu)函數(shù)编兄,則需要做一些析構(gòu)的邏輯處理轩性,如果沒有,則可以更快的釋放對象
uintptr_t has_cxx_dtor : 1; \
//存儲類指針的值狠鸳,開啟指針優(yōu)化的情況下揣苏,arm64位中有33位來存儲類的指針。
uintptr_t shiftcls : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
//判斷當(dāng)前對象是真的對象還是一段沒有初始化的空間
uintptr_t magic : 6; \
//是否有被弱引用件舵,沒有弱引用的對象釋放的更快
uintptr_t weakly_referenced : 1; \
//是否正在釋放
uintptr_t deallocating : 1; \
//是否有使用SideTable進(jìn)行引用計(jì)數(shù)
uintptr_t has_sidetable_rc : 1; \
//表示該對象的引用計(jì)數(shù)值卸察,實(shí)際上是引用計(jì)數(shù)減一。
uintptr_t extra_rc : 19
# elif __x86_64__
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 deallocating : 1; \
uintptr_t has_sidetable_rc : 1; \
uintptr_t extra_rc : 8
# endif
};
#endif
};