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

observeValueForKeyPath not called for property holding C++ object?

本文关键字:属性 对象 调用 observeValueForKeyPath C++      更新时间:2023-10-16

我遇到了一个奇怪的问题。

我的类声明了一个属性,该属性只保留一个指向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等正确设置属性

有任何线索这里可能有什么可疑之处
init方法中注册self是个坏主意。。?

编辑#1

当使用手动setter而不是合成setter时,setter将被调用

如果您的观察结果根本没有被调用,我首先会怀疑没有调用合成访问器,可能是因为有人直接访问ivar,而正是因为这个原因,您不应该这样做。试着实现一个自定义setter(它可以只做一个普通的赋值),并确保它被调用。


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

就我个人而言,我可能会在一个新项目中提取一个最小的测试用例,看看你是否可以在一个文件中复制它。我敢肯定,当你做完的时候,一定会很傻。名称不正确的方法。同一类的两个不同实例(而您看到的是错误的实例)。方法以您意想不到的顺序运行。类似的东西。

您应该使用keyword动态以实现苹果文档KVO Observing 中所述的KVO