clang編譯main.m.jpg
通過這張圖,我們可以發現以下幾點:
- 自定義類的類名是struct objc_object結構體的別名。
- struct DZPerson_IMPL結構體,包含兩個成員屬性:
- 第一個屬性上一篇文章介紹后,NSObject_IVARS 等效于 NSObject中的 isa。
- 第二個屬性是我們定義的成員_name
objc_class 與 objc_object
查看NSObject_IMPL結構體,里面有一個成員isa,是Class類型。繼續在文件中找到Class是struct objc_class *結構體指針類型。
struct NSObject_IMPL {
Class isa;
};
typedef struct objc_class *Class;
此時我們進入bjc4源碼中,去搜索objc_class的定義,源碼中對其的定義有兩個版本,舊版 位于 runtime.h中,已經被廢除,這里不做贅述,新版位于objc-runtime-new.h,這個是objc4-781最新優化的,我們后面的類的結構分析也是基于新版來分析的。
objc_class.png
其中cache,存儲的是緩存相關信息。
bits里面存放類的相關數據(成員、屬性、方法、協議等相關數據信息)。
從新版的定義中,可以看到 objc_class 結構體類型是繼承自 objc_object的。因此我們繼續去查找objc_object的源碼,他也有兩個版本:
- 第一個位于 objc.h,沒有被廢除,從編譯的main.cpp中可以看到,使用的這個版本的objc_object。
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
//編譯后的main.cpp中的objc_object的定義
struct objc_object {
Class _Nonnull isa __attribute__((deprecated));
};
- 第二個位于 objc-privat.h
struct objc_object {
private:
isa_t isa;
通過上述的源碼查找以及main.cpp中底層編譯源碼,可以得到以下幾點結論:
- 結構體類型objc_class 繼承自objc_object類型,其中objc_object也是一個結構體,且有一個isa屬性,所以objc_class也擁有了isa屬性
- mian.cpp底層編譯文件中,NSObject中的isa在底層是由Class 定義的,其中class的底層編碼來自 objc_class類型,所以NSObject也擁有了isa屬性
- NSObject 是一個類,用它初始化一個實例對象objc,objc 滿足 objc_object 的特性(即有isa屬性),主要是因為isa 是由 NSObject 從objc_class繼承過來的,而objc_class繼承自objc_object,objc_object 有isa屬性。所以對象都有一個 isa,isa表示指向,來自于當前的objc_object
總的來說,就是萬物皆對象,萬物皆來源于objc_object,所以所有的對象 + 類 + 元類 都有isa屬性。