0

我有一个表,里面装满了我正在观察的对象数组,当我删除所有对象时,我删除了观察者,但问题是当我删除数组中的所有对象然后再次开始添加它时到阵列我得到 removeObserver 问题。

我对我的对象有强烈的参考

我以这种方式添加观察者

[self.object addObserver:self forKeyPath:kTaskCompletedKey options:NSKeyValueObservingOptionNew context:&kTaskObservationContext];

我正在以这种方式删除它

- (void)dealloc;
{
    [self.object removeObserver:self forKeyPath:kTaskCompletedKey context:&kTaskObservationContext];    
}

以及当我使用 delete 方法删除表中的对象时

我尝试使用 NSKVODeallocateBreak 设置断点,我观察到它停止了该行@sythesize object = m_object;,我不明白这意味着什么所以,请朋友们帮帮我

问候兰吉特

4

1 回答 1

3

您必须在删除对象之前删除观察。这样做之后,您可以发送一些调试消息,让您记录当前观察者 - 发送它然后验证没有观察者。然后您可以安全地释放对象。

编辑:如果您正在观察的对象,您可以在其释放的日志中添加日志 - 它最好报告没有观察者。因此,将其添加到您观察到的对象的 dealloc 中:

NSLog(@"Dealloc of %@ with observationInfo: %@", self, [self observationInfo]);

在您的控制器中,就在您释放观察到的对象之前(我假设是通过从数组中删除它来完成的),使用此日志:

id foo = [myArray objectAtIndex:whatever];
NSLog(@"Release %@ with observationInfo: %@", foo, [foo observationInfo]);

如果你发现你正在释放一个你仍在观察的对象,那就是一个问题。如果一个对象被释放并且它仍然被观察到,那也是一个问题。

编辑:在将对象添加到数组之前,测试它是否已经存在。如果不是,那么观察它。如果是,那么你知道你已经在观察它了。

于 2012-09-26T11:48:50.957 回答