美文网首页iOS学习开发
Objective-C中Class的本质

Objective-C中Class的本质

作者: DinoGuy | 来源:发表于2018-05-24 00:03 被阅读3次

类(class)和元类(meta-class)底层都是 objc_class 结构体的指针,内存中就是结构体。

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class _Nullable super_class                              OBJC2_UNAVAILABLE;
    const char * _Nonnull name                               OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;

之前没有注意到 OBJC2_UNAVAILABLE(眼瞎啊!!!),最近才注意到,这部分结构体已经弃用了,那新的是什么样?有变化吗?变化大吗?抱着这些问题,一起往下看。
源码下载地址

注意:因源码结构体太长,以下是部分截取

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() { 
        return bits.data();
    }
    void setData(class_rw_t *newData) {
        bits.setData(newData);
    }

发现这里是一个继承关系,objc_class 继承自 objc_object,先放放,后面会提到。
这里的 superclasscache,很容易看明白,可是 class_rw_t 是什么?

struct class_rw_t {
    // Be warned that Symbolication knows the layout of this structure.
    uint32_t flags;
    uint32_t version;

    const class_ro_t *ro;

    method_array_t methods;          // 方法列表
    property_array_t properties;     // 属性列表
    protocol_array_t protocols;      // 协议列表

此结构体存放着我们熟悉的 方法列表属性列表协议列表 等。

const class_ro_t *ro; 这个又是什么鬼?

struct class_ro_t {
    uint32_t flags;
    uint32_t instanceStart;
    uint32_t instanceSize;      // 事例对象大小
#ifdef __LP64__
    uint32_t reserved;
#endif

    const uint8_t * ivarLayout;
    
    const char * name;         // 类名
    method_list_t * baseMethodList;
    protocol_list_t * baseProtocols;
    const ivar_list_t * ivars;   // 成员变量

    const uint8_t * weakIvarLayout;
    property_list_t *baseProperties;

    method_list_t *baseMethods() const {
        return baseMethodList;
    }
};

此结构体存放着 实例对象大小类名成员变量 等。

objc-private.h文件中

struct objc_object {
private:
    isa_t isa;

public:

    // ISA() assumes this is NOT a tagged pointer object
    Class ISA();

    // getIsa() allows this to be a tagged pointer object
    Class getIsa();

isa 指针出现了,看到这就明白了,因为 objc_class 继承自 objc_object,所以 objc_class 也拥有 isa 指针。

相关文章

网友评论

    本文标题:Objective-C中Class的本质

    本文链接:https://www.haomeiwen.com/subject/egadjftx.html