isa指針指向和類結(jié)構(gòu)分析
isa指向圖
經(jīng)典的isa指向圖
isa流程圖.png
從這張圖能總結(jié)出
類繼承自父類,父類繼承于NSObject,NSObject繼承于nil;
isa指向為:對象->類對象->元類對象->根元類; 根元類的isa指向自己,且根元類繼承自NSObject;
類結(jié)構(gòu)分析
ios類到底是什么?
把類編譯成c++文件,發(fā)現(xiàn) 類被編譯成一個struct
typedef struct objc_class *Class;
我們在源碼中直接搜索 struct objc_class,然后定位到 objc-runtime-new.h 文件
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();
}
// 省略部分代碼.......
}
/// Represents an instance of a class.
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
objc_class
繼承 objc_object
能看出兩個問題
- 對象與
objc_object
關(guān)系是繼承關(guān)系
2.objc_object
中有isa
,這就驗證了對象,類,元類都有isa
objc_class
, objc_object
,NSObject
,object
,isa
之間的關(guān)系圖
2251862-7b4c0996f92eb166.png
具體分析類結(jié)構(gòu)
ObjC 類中的屬性、方法還有遵循的協(xié)議等信息都保存在 class_rw_t中
WX20200914-174552@2x.png