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

时间:2013-01-16 17:58:45

标签: iphone ios key-value-observing

我正在查看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次,但我仍然想知道为什么会这样。

2 个答案:

答案 0 :(得分:1)

问题很可能是每次调用viewWillDisappear:时多次调用viewWillAppear:。由于这似乎很少发生,所以必然会有一些奇怪的事件序列导致这种情况发生。

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

答案 1 :(得分:1)

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

请查看this question以获取更详细的说明。

相关问题