是否定义了更改Objective-C对象isa的行为?

时间:2009-02-17 16:42:55

标签: objective-c dynamic-typing

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

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

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

4 个答案:

答案 0 :(得分:1)

我认为这就像你说的那样,很脏。

我怀疑它会起作用:

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

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

答案 1 :(得分:1)

Objective-C运行时现在提供了执行此操作的功能:object_setClass。文档没有说明有什么限制,但是(正如其他人所说的那样)我想你会想要将新类限制为一个具有完全实例变量布局的类作为原始类。

答案 2 :(得分:0)

改变这些是非常糟糕的形式,它对运行时行为做出了各种各样的假设 - 你使用runtime functions要好得多,尽管它们没有为你提供直接改变它的机制类。

答案 3 :(得分:0)

Joshua Weinberg的

This answer提供了正确的方法。它对我有用。 :)

Darron在他受过良好教育的猜测中是正确的:)只有当它是当前对象的超类时,如果你没有添加任何成员,它才会起作用。