KVO崩溃App

时间:2012-08-21 12:17:13

标签: ios key-value-observing

我在iOS应用中遇到KVO问题。我似乎无法做对。我想做什么:

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

注意:我正在使用[object addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]将MenuViewController注册为观察者,并使用[object removeObserver:self forKeyPath:@"name" context:nil]注销。

Szenario 1:

o我将注册作为观察者放在-viewWillAppear方法和-viewWillDisappear中的removeObserver代码中。 o当值更改并且i完全更改rootViewController时,我收到错误“消息已发送到解除分配的实例”。所以我想MenuViewController仍然被注册为观察者。

Szenario 2:

o结果我将removeObserver代码放入dealloc函数(后来还将addObserver部分移到了viewDidLoad中) o现在我得到一个不同的错误:无法从< ...>中移除关键路径“name”的观察者因为它没有注册为观察员。

所以也许有人可以给我一个关于我的问题的提示以及如何以正确的方式做KVO。不幸的是,到目前为止,文档无法帮助我。

谢谢!

2 个答案:

答案 0 :(得分:2)

您的视图控制器在取消分配之前并不总是获取viewWillDisappear。你的技术接近你应该做的。您可以获取多个viewDidLoad消息(如果系统卸载您的视图)和viewWillAppear,但只能获得一个dealloc。

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

NSLog(@"DID observe %@", object);

在dealloc(或您想要的任何其他地方)中,添加

if(didObserve) {
  unobserve
  NSLog(@"UNDID observe %@", object);
}

现在运行你的应用程序,验证你得到两条消息,每次验证对象是同一个对象(而不是nil)。这应该可以帮助你解决它。您甚至可以在“observeValueForKeyPath:”中记录日志,记录对该变量的任何更改。

答案 1 :(得分:0)

你的例子中的'对象'是什么?这很可能是你麻烦的根源(例如已被解除分配)。