什么时候应该从closures的ViewController类中观察持续的Model类调用removeObserver:forKeyPath?

我有一个ViewController类,它有一个属性,我想在模型更改上观察属性。 在我的模型对象中,我有一个在我的应用程序的背景中定期更新的属性。 随着更新,我需要在我的ViewController执行代码。

为此,我在ViewController viewDidLoad方法中创build了一个观察者模型。

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

正如你所看到的,这没有什么特别的,观察方法的行为,只要我离开我的屏幕上显示的视图。 如果我从父视图中删除上述视图,当我的ModelObject实例Mode属性更改时,我得到一个EXC_BAD_ACCESS错误消息。 具体来说,我的应用程序在更新Mode属性的行上崩溃,并且我在ModelObject实例内的以下代码行上收到最没用的EXC_BAD_ACCESS。

 //This is located in a method that periodically toggles the value of "State" [self setState: 2]; 

我会假设这个问题的解决scheme是从我的ViewController某个地方调用[ModelObject removeObserver: self forKeyPath:@"State"] ,当它从它的父级子视图数组中移除时。 不过,我在viewDidUnload方法中添加了一行代码,但是我发现viewDidUnload方法没有被调用。 我不确定这是否是正确的地方,但它需要去哪里。

我可能做错了什么? 我知道问题是KVO相关,因为如果我删除了观察,应用程序工作没有任何问题。 我的模型实例可以根据需要切换这个值,我的应用程序也不会崩溃。 我应该怎么做才能确保观察视图从其父视图的子视图中被移除时,我的观察者被正确地移除了?

我通常喜欢把addObserver:removeObserver:viewWillAppear:viewWillDisappear: 。 我发现这些是比viewDidLoadviewDidUnload更可靠的书挡。

您应该在视图控制器的-dealloc中删除它