5

在 Objective-C 中,您可以在运行时通过分配对象的isa成员变量来更改对象的动态类型:

id object = ...;
object->isa = [SomeClass class];

这是未定义的行为吗?我目前正在这样做,因为它是为了做其他事情,它似乎正在工作,但我觉得这样做很肮脏。我设置的新类没有添加任何成员变量,它只是覆盖了一个方法并添加了一个新方法,因此类大小是相同的。我觉得如果我改变对象的大小,会导致很多问题。

4

4 回答 4

1

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.

于 2013-08-28T15:30:53.787 回答
1

正如你所说,我认为这很脏。

我怀疑它会在以下情况下起作用:

  • 新分配的类是真实类的子类。
  • 新类不添加任何成员变量。

但我承认我不知道您的 Objective-C 运行时系统的具体实现。我只知道实施对我有意义。

于 2009-02-17T16:59:03.907 回答
0

改变这些真的很糟糕,而且它对运行时行为做出了各种各样的假设——尽管它们没有为您提供直接更改类的机制,但使用运行时函数会更好。

于 2009-02-18T05:05:30.303 回答
0

Joshua Weinberg 的这个答案提供了正确的方法。它对我有用。:)

Darron 的猜测是正确的 :) 只有当它是当前对象的超类并且不添加任何成员时,它才会起作用。

于 2012-01-08T20:34:09.833 回答