美文网首页
iOS底层 - Class的结构

iOS底层 - Class的结构

作者: 水中的蓝天 | 来源:发表于2020-03-26 11:00 被阅读0次

本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢 !

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

相关文章

网友评论

      本文标题:iOS底层 - Class的结构

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