类的结构分析

在上一篇的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指向根元类,即NSObject
4、根元类isa指向自己

三、superclass的走向

对象对象之间没有继承关系,但是之间有继承关系,依旧是那张图:

superclass流程图

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

你可能感兴趣的:(类的结构分析)