给对象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也是一样,无法在运行时添加。
网友评论