我有一个奇怪的问题。
我的类声明了一个只保留指向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
当使用手动设置器而不是合成的设置器被称为时。
答案 0 :(得分:1)
如果你的观察结果没有被调用,我首先怀疑合成的存取器没有被调用,可能是因为有人正在直接访问ivars,你不应该这样做。尝试实现一个自定义setter(它可以只进行正常的分配)并确保它被调用。
编辑:我的下一个测试是确保您已正确命名您的观察方法。我不知道这是Mac还是iOS;在Mac上,错误地命名观察方法不会使应用程序崩溃。在iOS上它会崩溃,除非您碰巧在其他地方实现了它(超类,或在您的实现中的其他地方实现)。
就个人而言,我可能会将一个最小的测试用例放到一个新项目中,看看你是否可以在一个文件中重现它。我相信当你完成它会变成愚蠢的东西。命名不当的方法。同一类的两个不同实例(你看错了)。按您不期望的顺序运行的方法。这样的事情。
答案 1 :(得分:-1)
您应该使用keyword
动态来实现KVO,如Apple的文档中所述KVO Observing