gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:11:56 24 4
gpt4 key购买 nike

我有一个奇怪的问题。

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

@property (assign) CPPObject *representedObject;

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

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

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

但是我的 observeValueForKeyPath:ofObject:change:context: 方法从未被调用。

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

有什么线索这里有什么可疑的......?
init 方法中注册 self 是个坏主意..?

编辑#1

当使用手动 setter 而不是合成 setter 时,正在调用

最佳答案

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


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

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

关于c++ - 没有为持有 C++ 对象的属性调用 observeValueForKeyPath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13791846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com