我什么时候应该从正在观察持久模型类的正在关闭的 ViewController 类中调用removeObserver:forKeyPath?

2024-05-05

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

为此,我从我的模型中创建了一个观察者ViewController viewDidLoad method.

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

正如您所看到的,这没什么特别的,只要我将视图保留在屏幕上,观察方法就会正常运行。如果我从父视图中删除上述视图,我会得到一个EXC_BAD_ACCESS当我的时出现错误消息ModelObject实例Mode属性变化。具体来说,我的应用程序在更新的行崩溃Mode财产,我收到的大多是无用的EXC_BAD_ACCESS在 ModelObject 实例中的以下代码行上。

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

我假设这个问题的解决方案是调用[ModelObject removeObserver: self forKeyPath:@"State"]从我内心的某个地方ViewController当它从其父子视图数组中删除时。但是,我已在我的代码中添加了该行代码viewDidUnload方法,但我发现了viewDidUnload方法未被调用。我不确定那是不是正确的地方,但它需要去某个地方。

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


我一般喜欢把addObserver: and removeObserver: in viewWillAppear: and viewWillDisappear:。我发现这些书挡比viewDidLoad and viewDidUnload.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我什么时候应该从正在观察持久模型类的正在关闭的 ViewController 类中调用removeObserver:forKeyPath? 的相关文章

随机推荐