在ios中删除KVO中的观察者问题

时间:2012-09-26 11:20:26

标签: ios ios5 key-value-observing

我有一个表格,其中填充了一些对象,我正在观察,当我删除所有对象时,我删除了观察者,但问题是当我删除数组中的所有对象然后再次开始将它添加到数组我得到removeObserver问题。

我对我的对象有强烈的引用

我以这种方式添加Observer

[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;并且我不明白这意味着什么 所以,朋友们请帮帮我

此致 兰吉特

1 个答案:

答案 0 :(得分:3)

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

编辑:如果您正在观察的对象,您可以在其解除分配中添加日志 - 最好不要向观察者报告。因此,将其添加到被观察对象的dealloc中:

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

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

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

如果你发现你正在发布一个你仍在观察的物体,那就是一个问题。如果一个对象被解除分配并且仍然被观察到这也是一个问题。

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