1

我在 iOS 应用程序中遇到了 KVO 问题。我似乎无法正确处理。我正在尝试做的事情:

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

注意:我[object addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]用于将 MenuViewController 注册为观察者并[object removeObserver:self forKeyPath:@"name" context:nil]取消注册。

场景 1:

o 我将注册为观察者的-viewWillAppear方法和 removeObserver 代码放在-viewWillDisappear. o 当值更改并且我完全更改了 rootViewController 时,我收到错误消息“发送到已释放实例的消息”。所以我猜 MenuViewController 仍然注册为观察者。

场景 2:

o 结果,我将removeObserver代码放入 dealloc 函数中(后来也将addObserver部分移到 viewDidLoad 中)作为观察者。

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

谢谢!

4

2 回答 2

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:”中添加一个日志,记录对该变量的任何更改。

于 2012-08-21T13:09:56.057 回答
0

您的示例中的“对象”是什么?这很可能是您的麻烦的根源(例如已被释放)的对象。

于 2012-08-21T12:26:29.773 回答