类的结构分析

类结构分析图

类结构分析图

这里直接上图会比较清晰一些,源码的追踪过程这里就不赘述了。主要追踪关键方法objc_class : objc_object

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);
    }

    void setInfo(uint32_t set) {
        ASSERT(isFuture()  ||  isRealized());
        data()->setFlags(set);
    }

    void clearInfo(uint32_t clear) {
        ASSERT(isFuture()  ||  isRealized());
        data()->clearFlags(clear);
    }

    // set and clear must not overlap
    void changeInfo(uint32_t set, uint32_t clear) {
        ASSERT(isFuture()  ||  isRealized());
        ASSERT((set & clear) == 0);
        data()->changeFlags(set, clear);
    }

    // 此处省略一万行
}

isa

objc_class的第一个成员isa,源码里虽然注释,但也在提醒我们objc_class继承自objc_object,自带了isa特性。isa的流程也已经在上篇文章OC底层-ISA的前生今世分析过了,感兴趣的可以直接去看。占位8字节。

Class superclass

Class superclass表示的父类,也是8字节。

cache_t cache

cache_t cache表示方法缓存,用散列表来缓存调用过的方法,可以提高访问方法的速度。cache_t cache是方法调用又一巧妙设计,这里只关心它在类中占据的内存大小16字节。

class_data_bits_t bits

class_data_bits_t bits 关键先生存储的大部分信息,可以类比isauintptr bits

class_rw_t

class_rw_t中存储这属性列表property_array_t properties、实例方法列表method_array_t methods、协议列表protocol_array_t protocols等信息。class_rw_t中这些存储是程序在runtime(运行时)拷贝添加的,它会先将class_ro_t的内容拷贝过去,然后再将当前类的分类的这些属性方法协议等拷贝到其中。

class_ro_t

class_ro_t中存储这成员变量列表ivar_list_t ivars、类方法列表method_list_t baseMethodList、协议列表protocol_list_t baseProtocols等信息。class_ro_tro的意思是read only,所以class_ro_t存储了当前类在编译期就已经确定的成员变量类方法以及遵循的协议

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