這是我參與8月更文挑戰的第5天,活動詳情查看:8月更文挑戰緩存
將實例對象isa
進行&
運算,可獲得類對象的地址。一樣在OC中,類也是一個對象。既然是對象,也會存在isa
指針,指向他所屬的類。這就是咱們所說的元類(MetalClass
)。markdown
MetalClass
)isa
爲nonpoionter
類型,除了類對象地址,isa中包含類信息,因此&運算後地址不一樣isa
爲非nonpointer
類型,屬於純isa指針,只存儲類對象的地址,全部&運算後地址相同NSObject
做爲根類,它的isa
指向的元類,稱爲根元類。XXClass
元類isa
指向的地址相同。XXClass
的元類isa,指向的並非NSObject
,而是根元類(NSObject的元類
)。isa
指向本身。繼承鏈流程圖數據結構
NSObject
做爲根類,它纔是真正的萬物之主,全部類都源於NSObject
類也是一個對象,有本身的數據結構,而類的底層來自objc_class
結構體,可經過源碼分析類的結構,在objc-runtime-new.h
中,能夠看到objc_class結構體的定義:源碼分析
struct objc_class : objc_object {
objc_class(const objc_class&) = delete;
objc_class(objc_class&&) = delete;
void operator=(const objc_class&) = delete;
void operator=(objc_class&&) = delete;
// 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
...
};
複製代碼
從上面的源碼定義來看,咱們的類也是一個對象,只是裏面比對象多了幾個成員變量superclass、cache、bits。post