ios – 实例被释放,而关键价值观察者仍然注册

前端之家收集整理的这篇文章主要介绍了ios – 实例被释放,而关键价值观察者仍然注册前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个UITableView.

在这里我有不同的单元格.每个单元格都有一个模型.使用KVO和NotificationCenter,单元格会收听模型以进行更改.当我离开ViewController我得到这个错误

An instance 0x109564200 of class Model was deallocated while key value observers were still registered with it. 
Observation info was leaked,and may even become mistakenly attached to some other object. 
Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:
<NSKeyValueObservationInfo 0x109429cc0> (
<NSKeyValueObservance 0x109429c50: Observer: 0x10942d1c0,Key path: name,Options: <New: NO,Old: NO,Prior: NO> Context: 0x0,Property: 0x10968fa00>
)

在单元格中,当模型属性设置/更改时,我执行此操作:

[_model addObserver:self
         forKeyPath:@"name"
            options:0
            context:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(modelIsInvalid:)
                                             name:@"modelIsInvalid"
                                           object:_model];

然后在单元格的dealloc中:

- (void)dealloc
{
    NSLog(@"DEALLOC CELL");
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [_model removeObserver:self forKeyPath:@"name"];
}

在模型中,我还检查它什么时候被释放:

- (void)dealloc
{
    NSLog(@"DEALLOC MODEL");
}

所有单元格在所有模型之前被释放,但是我仍然收到这个错误.另外我不知道如何设置错误中提到的断点.

解决方法

它不会工作,因为细胞被重复使用.所以当这个单元格离开屏幕时,它不会被释放,所以它去重用池.

您不应该在单元格中注册通知和KVO.您应该在表视图控制器中执行,而在模型更改时,应更新模型并重新加载可见单元格.

猜你在找的iOS相关文章