美文网首页
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