gpt4 book ai didi

objective-c - 我应该什么时候调用 removeObserver :forKeyPath from within a closing ViewController class that is observing a persistant Model class?

转载 作者:可可西里 更新时间:2023-11-01 04:22:58 26 4
gpt4 key购买 nike

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

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

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

如您所见,这没什么特别的,只要我将 View 显示在屏幕上,观察方法就会正常运行。如果我从父 View 中删除上述 View ,当我的 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];

我假设这个问题的解决方案是在我的 ViewController 从中删除时调用 [ModelObject removeObserver: self forKeyPath:@"State"]它是父 subview 数组。但是,我在我的 viewDidUnload 方法中添加了那行代码,但我发现 viewDidUnload 方法没有被调用。我不确定那是否是正确的地方,但它需要去一些地方。

我可能做错了什么?我知道问题与 KVO 相关,因为如果我删除观察,应用程序可以正常工作。我的模型实例可以随心所欲地切换这个值,而且我的应用程序永远不会崩溃。当从其父 View 数组中删除观察 View 时,我应该怎么做才能确保我的观察者被正确删除?

最佳答案

我通常喜欢将 addObserver:removeObserver: 放在 viewWillAppear:viewWillDisappear: 中。我发现这些书挡比 viewDidLoadviewDidUnload 更可靠。

关于objective-c - 我应该什么时候调用 removeObserver :forKeyPath from within a closing ViewController class that is observing a persistant Model class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9116557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com