我在这里看一个表格视图单元格,我发现这个代码:的keyValue观察者管理对象
- (void)awakeFromNib {
[super awakeFromNib];
[self addObserver:self forKeyPath:@"model.isDownloading" options:NSKeyValueObservingOptionNew context:NULL];
[self addObserver:self forKeyPath:@"model.isCached" options:NSKeyValueObservingOptionNew context:NULL];
[self addObserver:self forKeyPath:@"model.isOutDated" options:NSKeyValueObservingOptionNew context:NULL];
[self addObserver:self forKeyPath:@"model.cacheUpdateDate" options:NSKeyValueObservingOptionNew context:NULL];
[self addObserver:self forKeyPath:@"model" options:NSKeyValueObservingOptionNew context:NULL];
}
观察员在dealloc
方法去除。 model
是一个weak
属性,用于接收管理对象(核心数据)。
我收到虚假的崩溃,告诉我,托管对象被删除,但仍有注册观察员。
为什么发生错误对我来说很清楚:该对象在后台某处被移除,但仍然链接到tableview的单元格中。由于单元格上的dealloc
在应用程序的生命周期中基本上不会被调用,所以观察者永远不会被删除。由于对核心数据对象的引用是weak
,因此它将在后台静默释放 - 至少尝试。这失败了,因为模型仍然被观察到。
我有一些问题:
- 如果发现像“model.isDownloading”的路径,那么观察者被注册在
model
对象,而不是在self
二传手,是正确的? - 是objC足够聪明,如果
model
被重新分配来处理观察者变化(self.model = newThing
要求,即removeObserver
被分配newThing
之前呼吁model
,和观察员需要在那之后就newThing
需注册)。 - 因为崩溃发生在被管理对象的dealloc上,所以我认为一个简单的解决方案是,使
model
强大而不是weak
,当然可以确保它在prepareForReuse:
中正确设置为nil
。这是否有副作用,我没有意识到?
的错误信息是:
class xxx was deallocated while key value observers were still registered with it
我的事情是,tableview中被重用细胞,也许尝试删除的观察员方法prepareForReuse的uitableviewcell – rafaperez
这不是重点。我知道这个单元格被重用了。当单元格被重用时,模型被设置。看起来KVO正确地管理这种变化。然而,物体在背景中消失,没有细胞的实现。这就是为什么我认为我需要坚持“强”财产而不是弱财。 – thst