在 Objective-C 中,您可以在运行时通过分配对象的isa
成员变量来更改对象的动态类型:
id object = ...;
object->isa = [SomeClass class];
这是未定义的行为吗?我目前正在这样做,因为它是为了做其他事情,它似乎正在工作,但我觉得这样做很肮脏。我设置的新类没有添加任何成员变量,它只是覆盖了一个方法并添加了一个新方法,因此类大小是相同的。我觉得如果我改变对象的大小,会导致很多问题。
在 Objective-C 中,您可以在运行时通过分配对象的isa
成员变量来更改对象的动态类型:
id object = ...;
object->isa = [SomeClass class];
这是未定义的行为吗?我目前正在这样做,因为它是为了做其他事情,它似乎正在工作,但我觉得这样做很肮脏。我设置的新类没有添加任何成员变量,它只是覆盖了一个方法并添加了一个新方法,因此类大小是相同的。我觉得如果我改变对象的大小,会导致很多问题。
The Objective-C runtime now provides a function to do this: object_setClass
. The documentation doesn't say what restrictions there are, but (as others have stated) I imagine you would want to restrict the new class to a class with exactly the instance variable layout as the original class.
正如你所说,我认为这很脏。
我怀疑它会在以下情况下起作用:
但我承认我不知道您的 Objective-C 运行时系统的具体实现。我只知道实施对我有意义。
改变这些真的很糟糕,而且它对运行时行为做出了各种各样的假设——尽管它们没有为您提供直接更改类的机制,但使用运行时函数会更好。
Joshua Weinberg 的这个答案提供了正确的方法。它对我有用。:)
Darron 的猜测是正确的 :) 只有当它是当前对象的超类并且不添加任何成员时,它才会起作用。