在上一篇的isa结构分析中,我们经常看到Class的身影,Class就是我们常说的类,今天我们就来探索一下类(Class)。
一、Class
首先,在源码中,我们可以看到Class的定义:
typedef struct objc_class *Class;
发现Class是一个结构体指针,我们查看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,因为继承关系,所以objc_class也拥有isa,而Class又是以objc_class为模板创建的,所以这就解释了为什么对象和类都会有一个isa,同时因为继承的关系,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、元类是系统给的,定义和创建都是编译器来完成的
3、类方法只能存在元类中
4、元类本身没有名称,因为与类相关联,所以使用了同类名一样的名称
这里我们使用lldb探索一下isa走向:
1、这里打印了person的内存情况,结果可以看到打印的是LGPerson类,说明实例对象(Instance of Subclass)的isa指向的是类(class)

对象的isa指向
2、这里打印了
LGPerson类的内存情况,结果可以看到打印的还是LGPerson类,这里后面打印的LGPerson就是元类,说明类对象(class)的isa指向的是元类(meta class)
类的isa指向
3、这里打印了
元类的内存情况,结果可以看到打印的是NSObject类,这里NSObject就是根元类,说明元类(meta class)的isa指向的是根元类(Root meta class)
元类的isa指向
4、这里打印了
根元类的内存情况,结果可以看到打印的还是NSObject,说明根元类(Root meta class)的isa指向的是自己
根元类的isa指向
总结
1、
对象的isa指向类(也可称为类对象)2、
类的isa指向元类3、
元类的isa指向根元类,即NSObject4、
根元类的isa指向自己
三、superclass的走向
对象与对象之间没有继承关系,但是类之间有继承关系,依旧是那张图:

superclass流程图
这次我们看的是
实线(superclass)部分,这里Subclass是我们的LGTeacher类,Superclass是我们的LGPerson类,Root class是我们的NSObject类,可以看到类的继承关系链:LGTeacher(子类)--->LGPerson(父类)--->NSObject(根类)--->nil我们知道
类都有一个同名元类,元类的继承关系链:LGTeacher(子元类)--->LGPerson(父元类)--->NSObject(根元类)--->NSObject(根类)--->nil