【问题标题】:Objective-c: Swizzling class results in loss of properties from debugObjective-c: Swizzling 类导致调试中的属性丢失
【发布时间】:2014-04-19 09:09:44
【问题描述】:

我创建了一个运行时类,然后将一个实例调配为该新类的实例。

MyClass *object = [MyClass new];
Class subclass = objc_allocateClassPair([MyClass class], "MyClass_RuntimeClass", 0);
objc_registerClassPair(subclass);
object_setClass(object, subclass);

这很好用。 swizzling 后我可以调用 MyClass 上定义的方法和设置属性。

唯一的问题是调试器不再显示对象的属性。

Apple 似乎已经通过他们的 KVO 运行时类克服了这个问题。

我尝试使用 class_addProperty 在新类上添加属性,但由于它们已经定义,所以失败了。

我有什么遗漏吗?

【问题讨论】:

    标签: objective-c objective-c-runtime isa-swizzling


    【解决方案1】:

    Apple 会覆盖 class 方法来调用 super 的实现,从而实际上返回原始类(在您的情况下为 MyClass)。如果调试器使用class 属性来决定显示哪些属性,它会感到困惑,因为它没有MyClass_RuntimeClass 的定义。

    【讨论】:

    • 感谢您的回复,我试了一下,但没有成功:(我意识到,如果您在 KVO 实例上调用 object_getClass,它会返回 KVO 子类。如果您随后调用 class_copyPropertyList在那个 KVO 子类上,它不返回任何属性。所以我认为 Apple 正在做一些微妙的事情来欺骗调试器。老实说,我在练习 TDD 时并没有真正使用调试器。
    • KVOd 子类实际上实现了属性(包装器)来通知观察者。
    • Leo 感谢您的帮助。我意识到我的问题是由于我在课堂上重写了 forwardInvocation: 的实现。当我删除它时,我现在可以在调试器中看到所有内容。加上你所说的覆盖类方法,给了我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    相关资源
    最近更新 更多