美文网首页
2021-04-14 objc_class结构探究

2021-04-14 objc_class结构探究

作者: 牛牛大王奥利给 | 来源:发表于2021-04-14 23:23 被阅读0次
类和元类的本质都是这个objc_class。
objc_class的结构如下:

struct objc_class{
      Class isa;
      Class superclass;
      Cache_t cache;
      class_data_bits_t bits
};

所以,一个objc_class结构体中包含了一个isa指针,一个父类指针,方法列表缓存,以及class_data_bits_t对象。

那么calss_data_bits_t对象又是啥东西呢?根据objc源码可以查询到,class_data_bits_t的结构体方法返回了class_rw_t指针。

class_rw_t的结构如下:

struct class_rw_t{
    unit32_t flags;
    unit32_t version;
    const class_ro_t *ro;
    menthod_list_t *menthods;
    proprety_list_t *propreties;
    const protocol_list_t * protocol;
    Class firstsubclass;
    Class nextSibingclass;
    char * demangledname;
}

这个结构体其中包括了我们常用的方法列表,属性列表,协议等。以及一个class_ro_t指针。

class_ro_t结构如下:


struct class_ro_t{
     unit32_t flags;
     unit32_t instancestart;
     unit32_t instancesize;
#ifdef _ _LP64_ _
    unit32_t reserved;
#endif
     const unit8_t ivarlayout;
     const char *name;
     menthod_list_t *basementhods;
     const proprety_list_t *basepropreties;
     protocol_list_t *baseprotocols;
     const ivar_list_t *ivars;
     const unit8_t *weakivarslayout;
}

最后补充说明下class_rw_t 和class_ro_t的区别,为啥class_rw_t下面又设计个ro_t,从命名上来说ro应该是只读属性的,rw是读写,那么ro_t结构体里面的成员在编译时就确定了,是不可以再更改的了,编译时就有的方法,属性,成员变量,还有协议就都存在class_ro_t下,包括还有起始地址instancestart,和size。那么运行时添加的方法,属性,协议就存储在class_rw_t的结构体成员中,这样既在编译时期确定了类的大小,又不影响在运行时对类进行扩展。
后续有新的理解会继续补充

相关文章

网友评论

      本文标题:2021-04-14 objc_class结构探究

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