observeValueForKeyPath没有为持有C++对象的属性调用
observeValueForKeyPath not called for property holding C++ object?
我遇到了一个奇怪的问题。
我的类声明了一个属性,该属性只保留一个指向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
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- C++ 在堆栈中包含多态属性的类对象存储
- 为什么我的 DeviceInformation 对象没有 System.Devices.InterfaceClassGuid 属性?
- 私有对象的互斥体 - 全局与属性
- 如何从传递到对象的对象内部访问对象的类属性?
- 从 lambda 返回的对象将丢失属性值
- 是否可以在C++中移动临时对象的属性?
- 如何通过对象的类属性删除对象,并返回其对象值?
- 类对象属性是否可以调用返回属性应具有的值的方法C++?
- C++对象作为 Objective-C++ 属性
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组
- 对象属性同级访问
- 如何访问 JSCValue 对象的属性
- 从基于属性的列表中返回随机对象
- 迭代 Napi::对象属性(键)在 Node.js C++ N-API 中
- 返回对象会丢失属性
- 根据 C++ 中的属性对对象类进行分区的优化方法
- 基于对象的两个属性的自定义比较器会引发异常
- 创建新对象并立即为其设置属性时出现编译器错误
- 复合属性对象,当所有子对象都更改时,它禁止多个信号发射