1

我有一个奇怪的问题。

我的类声明了一个属性,它只保留一个指向 C++ 对象的指针:

@property (assign) CPPObject *representedObject;

然后,在init那个 Obj-C 类中,我将类本身注册为观察者,以便在有人为我的属性分配某些东西时得到通知(是的,我可以编写一个自定义设置器……anywho!)。

   [self addObserver:self
          forKeyPath:@"representedObject"
             options:NSKeyValueObservingOptionNew
             context:nil];

注册为观察者后转储observationInfo看起来没问题 - 应该已经注册了。

但是我的observeValueForKeyPath:ofObject:change:context:方法永远不会被调用。

浏览相关的 StackOverflow 主题并没有让我更接近解决这个问题。
该属性是通过 settingobject.representedObject等正确设置的。

任何线索这里可能有什么可疑之处..?在方法
中注册的坏主意..?selfinit

编辑#1

当使用手动设置器而不是合成的设置器时,将调用该设置器。

4

2 回答 2

1

如果您的观察结果根本没有被调用,我首先会怀疑合成访问器没有被调用,可能是因为有人直接访问了 ivars,而正是这个原因您不应该这样做。尝试实现一个自定义设置器(它可以做一个正常的分配)并确保它被调用。


编辑:我的下一个测试是确保您正确命名了观察方法。我不知道这是 Mac 还是 iOS;在 Mac 上,错误地命名观察方法不会导致应用程序崩溃。在 iOS 上它会崩溃,除非你碰巧在其他地方实现了它(超类,或者在你的实现中的其他地方实现)。

就个人而言,我可能会在一个新项目中提取一个最小的测试用例,看看是否可以在单个文件中重现它。我敢肯定,当你完成后,它会变得很愚蠢。命名错误的方法。同一类的两个不同实例(而您正在查看错误的实例)。方法以您不期望的顺序运行。类似的东西。

于 2012-12-09T21:22:33.113 回答
-1

您应该使用keyword动态来实现 KVO,如 Apple 的文档KVO Observing中所述

于 2016-05-07T12:37:07.647 回答