【问题标题】:Is it defined behavior to change an Objective-C object's isa?更改 Objective-C 对象的 isa 是否已定义行为?
【发布时间】:2009-02-17 16:42:55
【问题描述】:

在 Objective-C 中,您可以在运行时更改对象的动态类型,方法是为其分配 isa 成员变量:

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

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

【问题讨论】:

标签: objective-c dynamic-typing


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    Objective-C 运行时现在提供了一个函数来执行此操作:object_setClass。文档没有说明有什么限制,但是(正如其他人所说)我想您可能希望将新类限制为具有与原始类完全相同的实例变量布局的类。

    【讨论】:

      【解决方案3】:

      改变这些真的很糟糕,而且它对运行时行为做出各种假设——你最好使用runtime functions,尽管它们没有为你提供直接改变类的机制。

      【讨论】:

        【解决方案4】:

        This answer by Joshua Weinberg 提供了正确的方法来做到这一点。它对我有用。 :)

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多