我应该何时从正在观察持久模型类的结束ViewController类中调用removeObserver:forKeyPath?

RLH*_*RLH 5 model-view-controller memory-management objective-c key-value-observing ios

我有一个ViewController类具有属性,该属性是我想要观察的模型,因为模型上的属性发生了变化.在我的模型对象中,我有一个属性,在我的应用程序的后台定期更新.随着它的更新,我需要在我的内部执行代码ViewController.

为此,我在我的ViewController viewDidLoad方法中为我的模型创建了一个观察者.

[ModelObject addObserver:self 
              forKeyPath:@"State" 
                 options:NSKeyValueObservingOptionNew 
                 context:nil];
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这并不是什么特别的事情,只要我将视图显示在屏幕上,观察方法的行为就应该如此.如果我从父视图中删除上面的视图,我的实例属性更改EXC_BAD_ACCESS时会收到一条错误消息.具体来说,我的应用程序在更新属性的行崩溃,我在ModelObject实例中的以下代码行上收到了大部分无用的东西.ModelObjectModeModeEXC_BAD_ACCESS

//This is located in a method that periodically toggles the value of "State"
[self setState: 2];
Run Code Online (Sandbox Code Playgroud)

我会假设这个问题的解决方案是[ModelObject removeObserver: self forKeyPath:@"State"]从我ViewController父内部子视图中删除它时从我内部的某处调用.但是,我在我的viewDidUnload方法中添加了这行代码,但我发现该viewDidUnload方法没有被调用.我不确定这是不是正确的地方,但它需要去哪里.

我可能做错了什么?我知道这个问题与KVO有关,因为如果删除观察,应用程序就可以正常运行了.我的模型实例可以根据需要切换这个值,我的应用程序永远不会崩溃.当观察视图从其父视图的子视图数组中删除时,我应该怎么做以确保我的观察者被正确删除?

Rob*_*ier 9

我一般喜欢把addObserver:removeObserver:viewWillAppear:viewWillDisappear:.我发现这些比viewDidLoad和它更可靠viewDidUnload.