我正在使用object_setClass(id object, Class cls)
. 我正在将该类更改为原始类的子类。然后我设置了一些只在子类上定义的属性,一切似乎都很好。
我对此感到有点惊讶,因为object_setClass
据我所知,它不会重新分配对象,它只会更改isa
指针。如果子类实例比原始类实例大得多(意味着有更多的 ivars),我看不出该对象如何按预期工作。
这仅仅是因为内存中的对象之间有很多缓冲内存(由于对齐等)吗?
这是健壮的,还是在某些情况下会崩溃?
我正在使用object_setClass(id object, Class cls)
. 我正在将该类更改为原始类的子类。然后我设置了一些只在子类上定义的属性,一切似乎都很好。
我对此感到有点惊讶,因为object_setClass
据我所知,它不会重新分配对象,它只会更改isa
指针。如果子类实例比原始类实例大得多(意味着有更多的 ivars),我看不出该对象如何按预期工作。
这仅仅是因为内存中的对象之间有很多缓冲内存(由于对齐等)吗?
这是健壮的,还是在某些情况下会崩溃?
它可能会崩溃。从这里的运行时源代码中可以看出,它实际上只是交换了isa
指针。
如果您真的想将 替换isa
为isa
具有更多 ivars 的子类,则应使用class_createInstance
with nonzero extraBytes
。
不要使用更大的子类,而是使用objc_setAssociatedObject
andobjc_getAssociatedObject
将附加对象动态附加到现有的固定大小对象。