iphone - 为什么我的观察员未注册?

标签 iphone ios key-value-observing

我正在查看 TestFlight 中的崩溃报告,最常见的崩溃是:

Cannot remove an observer "ListViewController 0x1d590500" for the key path "batchImageDownloadingInProgress" from "ListArchiver 0x1d5b83b0" because it is not registered as an observer.

ListViewController 中:

- (void)viewWillAppear:(BOOL)animated
{
    ...

    [[WanderlistArchiver sharedArchiver] addObserver:self forKeyPath:@"batchImageDownloadingInProgress" options:NSKeyValueObservingOptionNew context:nil];
}

// **** the error happens in here ****
- (void)viewWillDisappear:(BOOL)animated
{
    ...

    [[WanderlistArchiver sharedArchiver] removeObserver:self forKeyPath:@"batchImageDownloadingInProgress"];
}

如果我在 viewWillAppear 中设置观察者(并且不要在代码中的其他任何地方触及它),为什么当 viewWillDisappear 运行时它仍然没有注册?这种情况在过去 90 天内只发生过 5 次,但我仍然想了解为什么会发生这种情况。

最佳答案

最有可能的问题是 viewWillDisappear: 在每次调用 viewWillAppear: 时被多次调用。由于这似乎很少发生,因此一定有一些奇怪的事件序列导致了这种情况的发生。

如果无法重现问题,一种可能的解决方法是添加 BOOL ivar。添加观察者时,在 viewWillAppear: 中将其设置为 YES。在 viewDidAppear: 中,检查它是否已设置。如果设置,则将其设置为 NO 并删除观察者。如果未设置,则您知道不要删除观察者。

关于iphone - 为什么我的观察员未注册?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14364736/

相关文章:

objective-c - 无法识别的选择器发送到实例,原因

ios - 后置摄像头的 captureStillImageAsynchronouslyFromConnection 问题

ios - 核心数据 : Emitting KVO notifications for transient, 派生属性

ios - 将 UITableViewCell 中的文本大写

iphone - 为什么 UIButton 标题不显示?

iphone - 通过 Xcode 安装 iOS IPA,钥匙串(keychain)中没有证书,也没有安装配置文件

c# - Xamarin Controller 和 xib 同一文件夹

ios - KVO 和 Core Data - 自观察托管对象

iphone - 在 Mobile Safari 中隐藏地址栏并显示阅读器按钮

iphone - UIView从View过渡: how can I do black background during transition?