在上一篇的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指向根元類,即NSObject4、
根元類的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