observeValueForKeyPath没有调用持有C ++对象的属性?

时间:2012-12-09 21:08:19

标签: c++ ios objective-c key-value-observing

我有一个奇怪的问题。

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

@property (assign) CPPObject *representedObject;

在那个Obj-C类的init中,我正在将类本身注册为观察者,以便在有人向我的财产分配东西时得到通知(是的,我可以写一个自定义的setter .... anywho !)。

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

在注册为观察员后倾倒observationInfo看起来没问题 - 应该已经注册。

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

查看相关的StackOverflow主题并没有让我更接近解决这个问题。
通过设置object.representedObject

来正确设置该属性

任何线索这里有什么可腥的。?
self方法中注册init的好主意..?

编辑#1

当使用手动设置器而不是合成的设置器被称为时。

2 个答案:

答案 0 :(得分:1)

如果你的观察结果没有被调用,我首先怀疑合成的存取器没有被调用,可能是因为有人正在直接访问ivars,你不应该这样做。尝试实现一个自定义setter(它可以只进行正常的分配)并确保它被调用。


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

就个人而言,我可能会将一个最小的测试用例放到一个新项目中,看看你是否可以在一个文件中重现它。我相信当你完成它会变成愚蠢的东西。命名不当的方法。同一类的两个不同实例(你看错了)。按您不期望的顺序运行的方法。这样的事情。

答案 1 :(得分:-1)

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