isa指針指向和類結(jié)構(gòu)分析

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能看出兩個問題

  1. 對象與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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。