iOS底层 Class的结构 - AlvinSunny/OC-TheUnderlying GitHub Wiki

class结构中最重要的属性就是isa指针

在arm64架构之前,存储了ISA指针指向对象的内存地址,但是在arm64之后需要在存储地址值&ISA_MASK 这个值才是指向对象的内存地址。示意图如下

QQ20200326-104436@2x.png

##objc4源码地址

QQ20200326-104412@2x.png

窥探struct object_class的结构

简化(去掉方法定义,保留属性)后的源码


objc-private.h

struct objc_object {
private:
    isa_t isa;
};

objc-runtime-new.h

这个结构体中包含的是类的原始信息,是不允许修改的
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;
}

这个结构体中包含的是程序员手动给类添加的信息,是可读可写的
struct class_rw_t {
    // Be warned that Symbolication knows the layout of this structure.
    uint32_t flags;
    uint16_t version;
    uint16_t witness;

    const class_ro_t *ro;

    method_array_t methods;
    property_array_t properties;
    protocol_array_t protocols;

    Class firstSubclass;
    Class nextSiblingClass;

    char *demangledName;
}

Class的底层结构
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 (class_rw_t *)(bits & FAST_DATA_MASK);
    }
  */
    class_rw_t *data() const {
        return bits.data();
    }
    
};

图解

class底层结构@2x.png