Ios KVO崩溃应用程序

Ios KVO崩溃应用程序,ios,key-value-observing,Ios,Key Value Observing,我在iOS应用程序中遇到KVO问题。我似乎做得不对。我想做的是: 我有一个MenuViewController(左侧可显示,如facebook应用程序),可以观察(并显示)全局值。我尝试了一些不同的方法,但我的应用程序总是崩溃(在不同的点,出于不同的原因)。我将在下面描述这些 注意:我正在使用[object addObserver:self forKeyPath:@“name”选项:NSKeyValueObservingOptionNew context:nil]将MenuViewControl

我在iOS应用程序中遇到KVO问题。我似乎做得不对。我想做的是:

我有一个MenuViewController(左侧可显示,如facebook应用程序),可以观察(并显示)全局值。我尝试了一些不同的方法,但我的应用程序总是崩溃(在不同的点,出于不同的原因)。我将在下面描述这些

注意:我正在使用
[object addObserver:self forKeyPath:@“name”选项:NSKeyValueObservingOptionNew context:nil]
将MenuViewController注册为观察者,并使用
[object removeObserver:self forKeyPath:@“name”context:nil]
取消注册

Szenario 1:

o我在
-view中将注册为观察者,并在
-view中将删除观察者代码。
o当值更改且i已完全更改rootViewController时,我会收到一条错误消息“message sent to deallocated instance”。所以我猜MenuViewController仍然注册为观察员

Szenario 2:

o因此,我将
removeObserver
代码放入dealloc函数中(随后还将
addObserver
部件移动到viewDidLoad中) o现在我遇到另一个错误:无法从中删除键路径“name”的观察者,因为它未注册为观察者

因此,也许有人可以给我一个提示,说明我的问题以及如何正确地进行KVO。不幸的是,医生们到目前为止还不能帮助我


谢谢

您的示例中的“对象”是什么?这可能是问题的根源所在(例如,已解除分配)。

视图控制器不总是获取视图,但在解除分配之前将消失。你的技术接近你应该做的。您可以获得多个viewDidLoad消息(如果系统卸载您的视图),并且ViewLoc将出现,但只有一个dealloc

你现在应该做的是使用一个BOOL ivar,didObserve。在viewDidLoad中,如果didObserve==NO,则观察对象,设置标志didObserve=YES,然后添加日志

NSLog(@"DID observe %@", object);
在dealloc(或您想要的任何其他位置)中,添加


现在运行你的应用程序,验证你是否收到了这两条消息,验证对象每次都是同一个对象(而不是零)。这应该能帮你解决问题。您甚至可以在“observeValueForKeyPath:”中记录对该变量的任何更改。

事实上,我不这么认为。但对于您的问题:它是一个NSManagedObject子类,存储为AppDelegate的属性。我一直在使用这个对象,到目前为止还没有任何释放问题。我不能再编辑了,但是我在设置新值之前立即记录了这个对象我的错误(误读了你的问题,认为释放实例错误发生在addObserver代码上)。请在您的observeValueForKeyPath代码上运行调试器,这可能是您的问题所在。没有问题,谢谢您的帮助!我使用了David H的解决方案,效果很好。
if(didObserve) {
  unobserve
  NSLog(@"UNDID observe %@", object);
}