0

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

无法从“ListArchiver 0x1d5b83b0”中删除关键路径“batchImageDownloadingInProgress”的观察者“ListViewController 0x1d590500”,因为它没有注册为观察者。

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 次,但我仍然想了解为什么会发生这种情况。

4

2 回答 2

1

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

如果您无法重现该问题,一种可能的解决方法是添加BOOLivar。viewWillAppear:添加观察者时将其设置为 YES 。在viewDidAppear:中,检查它是否已设置。如果设置,则将其设置为 NO 并移除观察者。如果没有设置,那么你就知道不要移除观察者。

于 2013-01-16T18:15:42.217 回答
1

你应该确保context是相同的。在您的删除语句中,您使用的是不使用上下文的方法。使用上下文变量代替nil并确保它在 add 和 remove 语句中是相同的。

查看这个问题以获得更详细的解释。

于 2013-01-16T18:16:20.743 回答