【问题标题】:Remove Observer issue in KVO in ios移除 ios 中 KVO 中的 Observer 问题
【发布时间】:2012-09-26 11:20:26
【问题描述】:

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

我对我的对象有一个强引用

我是这样添加观察者的

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

我正在以这种方式删除它

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

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

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

问候 兰吉特

【问题讨论】:

    标签: ios ios5 key-value-observing


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 嗨@David H 感谢您的回复,我在从数组中删除对象之前删除了观察结果,还有一件事,因为我有很强的参考,我不应该得到 removeObserver 问题吗?
    • 使用调试功能 - 我的 iPad 上没有 Xcode,它类似于 observeInfo。您可以在 KVO 页面或编码页面中找到它。我假设你销毁然后重新创建对象,问题是当旧对象被释放时你会得到一个异常。
    • 嗨@David H 你的意思是这个NSKVODeallocateBreak,我检查了它停在“@synthesize object = m_object”
    • 那是一条虚假消息——那行不是代码,而是变成了代码(setter getter)。
    • 嗨@David H,当我删除第一个对象时,在调试器中它说Release <Note: 0x7f06da0> with observationInfo: (null),后来当我删除剩余的对象时,我得到这个Release <Note: 0x7f09bf0> with observationInfo: <NSKeyValueObservationInfo 0x8b080d0> ( <NSKeyValueObservance 0x894ea40: Observer: 0x8951bd0, Key path: completed, Options: <New: YES, Old: NO, Prior: NO> Context: 0x2e4e0, Property: 0x8938530> )不知道这是什么意思。请帮忙
    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多