12

我正在使用object_setClass(id object, Class cls). 我正在将该类更改为原始类的子类然后我设置了一些只在子类上定义的属性,一切似乎都很好。

我对此感到有点惊讶,因为object_setClass据我所知,它不会重新分配对象,它只会更改isa指针。如果子类实例比原始类实例大得多(意味着有更多的 ivars),我看不出该对象如何按预期工作。

这仅仅是因为内存中的对象之间有很多缓冲内存(由于对齐等)吗?

这是健壮的,还是在某些情况下会崩溃?

4

2 回答 2

7

它可能会崩溃。从这里的运行时源代码中可以看出,它实际上只是交换了isa指针。

如果您真的想将 替换isaisa具有更多 ivars 的子类,则应使用class_createInstancewith nonzero extraBytes

于 2010-07-27T18:15:47.453 回答
3

不要使用更大的子类,而是使用objc_setAssociatedObjectandobjc_getAssociatedObject将附加对象动态附加到现有的固定大小对象。

于 2013-08-24T23:03:03.327 回答