什么时候应该从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:
。 我发现这些是比viewDidLoad
和viewDidUnload
更可靠的书挡。
您应该在视图控制器的-dealloc中删除它