2013-01-16 45 views
0

我期待通过TestFlight和最频繁的崩溃我的崩溃报告是:我的观察员为何未注册?

,因为它未注册无法删除观察员“ListViewController 0x1d590500”从“ListArchiver 0x1d5b83b0”关键路径“batchImageDownloadingInProgress”作为观察员。

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

+0

一定要调用'[super viewWillAppear:animated]'和'[super viewWillDisappear:animated]'。我不认为这是你的问题,但可能会导致意想不到的结果。 –

+0

是的,我确实这样做了,但是让它更加专注。 – djibouti33

+0

您的sharedArchiver单身人士如何处理?有没有可能在不同于addObserver的实例上调用removeObserver? – Taum

回答

1

最可能的问题是viewWillDisappear:被称为不止一次呼叫viewWillAppear:。由于这似乎很少发生,因此必定会有一些奇怪的事件序列导致这种情况发生。

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

1

你应该确保context是一样的。在你的remove语句中,你正在使用不使用上下文的方法。使用上下文变量而不是nil,并确保它在添加和删除语句中是相同的。

查看this question了解更多详细说明。

+0

感谢您的链接和建议。这个答案假定某个班级正在观察它的属性。我有一个对象观察另一个对象的属性。看起来像在ListArchiver#setBatchImageDownloadInProgress中设置观察会困难得多。 1)我不知道ListViewController的确切实例,2)跨两个对象共享相同的上下文(静态地址)会很复杂。也许我错过了一些东西;想法? – djibouti33

+0

我认为你可以让每个观察对象都有自己的上下文,这会使这个微不足道。 – Mundi

相关问题