美文网首页
class_addIvar 为什么不能添加成员变量

class_addIvar 为什么不能添加成员变量

作者: 初灬终 | 来源:发表于2019-10-14 22:10 被阅读0次

    给对象person添加一个age的成员变量,居然crash了。。。为什么无法新增成员变量?


    image.png

    源码(主干)

    struct objc_class : objc_object {
        class_rw_t *data() { 
            return bits.data();
        }
        void setData(class_rw_t *newData) {
            bits.setData(newData);
        }
    }
    
    struct class_rw_t {
        const class_ro_t *ro;
    }
    
    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;
    
        method_list_t *baseMethods() const {
            return baseMethodList;
        }
    };
    

    Class中的ivar信息是在class_ro_t,而ivarLayout和ivars都无法修改。

    总结

    1.为什么无法通过运行时添加ivar?
    因为ivar的内存布局ivarLayout,成员变量列表ivars都保存在class_ro_t结构体中,ivarLayout和ivars都是在运行时无法修改的。
    property也是一样,无法在运行时添加。

    相关文章

      网友评论

          本文标题:class_addIvar 为什么不能添加成员变量

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