美文网首页iOS 的那些事儿swiftiOS
class_ro_t 和 class_rw_t 的区别?

class_ro_t 和 class_rw_t 的区别?

作者: 繁星mind | 来源:发表于2019-04-24 22:27 被阅读0次

    class_ro_t 和 class_rw_t 的区别?

    struct class_rw_t {
        uint32_t flags;
        uint32_t version;
    
        const class_ro_t *ro;
    
        method_array_t methods;
        property_array_t properties;
        protocol_array_t protocols;
    
        Class firstSubclass;
        Class nextSiblingClass;
    };
    
    struct class_ro_t {
        uint32_t flags;
        uint32_t instanceStart;
        uint32_t instanceSize;
        uint32_t reserved;
    
        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;
    };
    

    可以看出,class_rw_t结构体内有一个指向class_ro_t结构体的指针。

    每个类都对应有一个class_ro_t结构体和一个class_rw_t结构体。在编译期间,class_ro_t结构体就已经确定,objc_class中的bits的data部分存放着该结构体的地址。在runtime运行之后,具体说来是在运行runtime的realizeClass 方法时,会生成class_rw_t结构体,该结构体包含了class_ro_t,并且更新data部分,换成class_rw_t结构体的地址。

    用两张图来说明这个过程:

    类的realizeClass运行之前:


    image.png

    类的realizeClass运行之后:


    image.png
    细看两个结构体的成员变量会发现很多相同的地方,他们都存放着当前类的属性、实例变量、方法、协议等等。区别在于:class_ro_t存放的是编译期间就确定的;而class_rw_t是在runtime时才确定,它会先将class_ro_t的内容拷贝过去,然后再将当前类的分类的这些属性、方法等拷贝到其中。所以可以说class_rw_t是class_ro_t的超集,当然实际访问类的方法、属性等也都是访问的class_rw_t中的内容

    参考:
    Objective-C runtime - 属性与方法

    相关文章

      网友评论

        本文标题:class_ro_t 和 class_rw_t 的区别?

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