類的結(jié)構(gòu)分析

在上一篇的isa結(jié)構(gòu)分析中,我們經(jīng)??吹?code>Class的身影,Class就是我們常說的,今天我們就來探索一下類(Class)。

一、Class

首先,在源碼中,我們可以看到Class的定義:

typedef struct objc_class *Class;

發(fā)現(xiàn)Class是一個結(jié)構(gòu)體指針,我們查看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();
    }
    void setData(class_rw_t *newData) {
        bits.setData(newData);
    }
    //部分代碼省略
    //...
}

從這里我們可以看到,objc_class繼承自objc_object,查看objc_object

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();
    
    uintptr_t isaBits() const;
    //部分代碼省略
    //...
}

可以看到,objc_object有一個isa_t isa,因為繼承關(guān)系,所以objc_class也擁有isa,而Class又是以objc_class為模板創(chuàng)建的,所以這就解釋了為什么對象和類都會有一個isa,同時因為繼承的關(guān)系,Class也算是對象,即類對象,這就驗證了萬物皆對象

二、isa的走向

首先,我們先看一張十分出名的圖:

isa流程圖
圖中分為虛線和實線,虛線是isa的走向,而實線是繼承的走向,這里我們對虛線部分進行下說明:
1、實例對象(Instance of Subclass)isa指向的是類(class)
2、類對象(class)isa指向的是元類(meta class)
3、元類(meta class)isa指向的是根元類(Root meta class)
4、根元類(Root meta class)isa指向的是自己

這里提到元類,簡單說明一下:
1、也是一個對象,稱為類對象,它的isa就是指向元類
2、元類系統(tǒng)給的,定義創(chuàng)建都是編譯器來完成的
3、類方法只能存在元類
4、元類本身沒有名稱,因為與關(guān)聯(lián),所以使用了同類名一樣的名稱

這里我們使用lldb探索一下isa走向:
1、這里打印了person的內(nèi)存情況,結(jié)果可以看到打印的是LGPerson類,說明實例對象(Instance of Subclass)isa指向的是類(class)

對象的isa指向

2、這里打印了LGPerson類的內(nèi)存情況,結(jié)果可以看到打印的還是LGPerson類,這里后面打印的LGPerson就是元類,說明類對象(class)isa指向的是元類(meta class)
類的isa指向

3、這里打印了元類的內(nèi)存情況,結(jié)果可以看到打印的是NSObject類,這里NSObject就是根元類,說明元類(meta class)isa指向的是根元類(Root meta class)
元類的isa指向

4、這里打印了根元類的內(nèi)存情況,結(jié)果可以看到打印的還是NSObject,說明根元類(Root meta class)isa指向的是自己
根元類的isa指向

總結(jié)
1、對象isa指向(也可稱為類對象
2、isa指向元類
3、元類isa指向根元類,即NSObject
4、根元類isa指向自己

三、superclass的走向

對象對象之間沒有繼承關(guān)系,但是之間有繼承關(guān)系,依舊是那張圖:

superclass流程圖

這次我們看的是實線(superclass)部分,這里Subclass是我們的LGTeacher類,Superclass是我們的LGPerson類,Root class是我們的NSObject類,可以看到類的繼承關(guān)系鏈:
LGTeacher(子類)--->LGPerson(父類)--->NSObject(根類)--->nil
我們知道都有一個同名元類,元類的繼承關(guān)系鏈:
LGTeacher(子元類)--->LGPerson(父元類)--->NSObject(根元類)--->NSObject(根類)--->nil

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容