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 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...