KVO:UITableViewCell观察模型属性 - 如何在模型deallocs时取消注册?

Ste*_*e N 6 objective-c key-value-observing uitableview

我有一个从模型对象加载的UITableViewCells .该物业上的异步加载,我看到从它的变化知道我什么时候可以重新加载它(和替换占位符图片).这是我的问题场景:imageViewUIImagemyObjectUIImagemyObjecttableViewCell

  1. 用户执行搜索,填充模型对象数组
  2. 这些模型对象用UITableViewCells 表示,并且iconImg观察属性以进行异步下载完成.(到目前为止,这很有效).
  3. 如果用户进行另一次搜索,我会丢弃那些原始模型对象,这会导致"一个类商家的实例被解除分配,而键值观察者仍然注册了它"消息,这听起来不太好.

deallocUITableViewCell取消注册单元格的方法,但是当我dealloc在上面的场景中使用基础模型时,不会调用该方法.有没有一种干净的方法告诉我的细胞在观察到的实例时取消注册dealloc?我可以删除模型对象中的所有观察者dealloc吗?

附带问题:为什么KVO不会自动从对象中删除已注册的观察者dealloc

Ste*_*e N 5

更新:请参阅我的评论以获得解决此问题的最佳方法.也就是说,要了解正在发生的事情,这个问题仍然可以提供信息......(最终更新)

解决了(至少在我的情况下).以下是发生的事情:

我的视图控制器用于显示搜索结果,并将搜索结果存储为模型对象数组.我使用自定义UITableViewCell子类来显示每个搜索结果,并且作为配置它的一部分,我将关联的模型对象(搜索结果)存储在自定义单元格的属性中,将其命名为myCell.modelObject.

正如我所指出的,除了最初的搜索之外,每次搜索都会发生错误.为了调试,我在NSKVODeallocateBreak上设置了一个符号断点,并发现在重新使用我的一个自定义单元格时发生这种情况:

- (void)configureWithModelObject:(ModelObject*)aModelObject {
    // @property (nonatomic, retain) ModelObject *modelObject;
    self.modelObject = aModelObject;  // <-- NSKVODeallocateBreak paused here
    ....
}
Run Code Online (Sandbox Code Playgroud)

因此,我的视图控制器在获得第二个搜索结果集时,将释放包含原始搜索模型对象的数组.那些仍然由我可重复使用的自定义单元格实例保留的那些将会坚持到底,至少在这些单元格再次被重复使用之前.此时,当更新self.modelObject时,先前的modelObject再次释放并最终解除分配,但由于正在观察它的单元格未被释放,而是被重新使用,我的[modelObject removeObserver ...]调用[ myCell dealloc]没有被调用.

解决方案:配置我的自定义单元格时,我需要检查模型对象是否已设置,这表明此单元格正在被重用.如果是这样,我在更新属性之前停止观察原始的modelObject:

- (void)configureWithModelObject:(ModelObject*)aModelObject {
    if(modelObject != nil) {
        // I'm being re-used! Stop observing old model object!
        [modelObject removeObserver:self forKeyPath:@"keyPathIWasObserving"];
    }
    self.modelObject = aModelObject;  // <-- NSKVODeallocateBreak paused here
    ....
Run Code Online (Sandbox Code Playgroud)

注意:我仍然需要在[cell dealloc]中调用[modelObject removeObserver ...]来处理视图控制器本身解除分配的情况.

我希望这对有类似模式的其他人有所帮助.

最好,史蒂夫

  • 仅供参考 - 也许更好的地方调用removeObserver(除了dealloc)在(void)prepareForReuse中,您可以在UITableViewCell子类中覆盖它.我修改了我的代码以这种方式工作. (3认同)