gpt4 book ai didi

ios - KVO 使应用程序崩溃

转载 作者:行者123 更新时间:2023-11-29 11:09:47 27 4
gpt4 key购买 nike

我在 iOS 应用程序中遇到 KVO 问题。我似乎无法正确处理。我正在尝试做什么:

我有一个 MenuViewController(可在左侧显示,如 facebook 应用程序)观察(并显示)全局值。我尝试了一些不同的方法,但我的应用程序总是崩溃(在不同的时间点和不同的原因)。我将在下面描述这些。

注意:我正在使用 [object addObserver:self forKeyPath:@"name"options:NSKeyValueObservingOptionNew context:nil] 将 MenuViewController 注册为观察者,并且 [object removeObserver:self forKeyPath:@"name"context:nil] 取消注册。

场景 1:

o 我把作为观察者的注册放在 -viewWillAppear 方法中,将 removeObserver 代码放在 -viewWillDisappear 中。o 当值发生变化并且我已经完全改变了 rootViewController 时,我收到一条错误消息“发送到已释放实例的消息”。所以我猜 MenuViewController 仍然注册为观察者。

场景 2:

o 因此,我将 removeObserver 代码放入了 dealloc 函数中(后来还将 addObserver 部分移到了 viewDidLoad 中)o 现在我得到一个不同的错误:无法从 <...> 中删除关键路径“名称”的观察者,因为它未注册为观察者。

所以也许有人可以就我的问题以及如何以正确的方式执行 KVO 给我提示。不幸的是,到目前为止,文档无法帮助我。

谢谢!

最佳答案

你的 View Controller 并不总是在它被释放之前得到 viewWillDisappear。你的技术接近你应该做的。您可以获得多个 viewDidLoad 消息(如果系统卸载您的 View )和 viewWillAppear,但只有一个 dealloc。

您现在应该做的是使用 BOOL ivar,didObserve。在viewDidLoad中,如果didObserve == NO,观察对象,设置flag didObserve=YES,然后添加日志

NSLog(@"DID observe %@", object);

在 dealloc 中(或任何你想要的地方),添加

if(didObserve) {
unobserve
NSLog(@"UNDID observe %@", object);
}

现在运行您的应用程序,验证您收到两条消息,验证对象每次都是同一个对象(而不是 nil)。这应该可以帮助您解决问题。您甚至可以在“observeValueForKeyPath:”中放置一个日志,记录对该变量的任何更改。

关于ios - KVO 使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12054661/

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