不再使用时从UITableViewCell中删除观察者

时间:2013-11-15 14:19:55

标签: ios iphone objective-c uitableview automatic-ref-counting

我正在尝试在转移到ARC后调整我的项目。 我最大的问题是目前由于循环引用而没有释放对象。例如。在UIView上没有调用dealloc(我之前用它来释放对象并将它们放在nil上,因为这些对象阻止了dealloc。

对于UIViews,我可以在ViewDidDisappear'上做一些逻辑。并决定不再需要它,但现在我有UITableViewCells的问题。在一个我有一个Notification观察者,如果创建观察者,单元格将保留在内存中。

检测是否不再需要(例如)UITableViewCell的实例的最佳方法是什么,以便我可以移除观察者并且对象可以从内存中释放自己?

这是我的标题:

@interface DOArticleListCell : DOPrototypeCell {
    IBOutlet UILabel *_title;
    IBOutlet UILabel *_summary;
    IBOutlet UILabel *_site;
    IBOutlet UILabel *_update;
    IBOutlet UILabel *_unpublished;
    IBOutlet UIButton *_readButton;

    __weak DOArticle *_article;
    NSNumber* _isEditor;
}

@property (nonatomic, weak) DOArticle *article;

- (void)updateReadButton;
- (IBAction)toggleReadButton:(id)sender;

@end

(原型单元只有一个名为' populateCell'的功能。)

聚苯乙烯。我需要观察者更新“阅读”#39;选择单元格时调用detailViewController时的标签。

3 个答案:

答案 0 :(得分:4)

您很可能不想在您的手机上使用观察者。为什么不?你的细胞正在重复使用。假设您在表格视图中有400个项目。在任何给定时间,屏幕上仅显示约8个。这意味着只有8或9个单元格实例将保留在内存中,并在用户滚动时重复使用。这意味着每次单元格滚出视图时都必须删除观察者,并且需要为重用单元格添加新的观察者。你可以通过覆盖单元格的prepareForReuse方法来做到这一点。但是,保存任何类型的状态(例如将单元格标记为“读取”)不应在单元格中完成,而应在模型中完成。

因为在您的情况下,用户操作会触发read状态的更新,您只需在read中将数据模型项设置为tableView:didSelectRowAtIndexPath:,然后通过以下方式显式更新该单元格在自定义单元格上调用自定义方法或调用[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

希望它有所帮助。

答案 1 :(得分:2)

尽管有ARC,你仍然可以在你的类中实现 - (void)dealloc并调用

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"yourNotName" object:nil]

答案 2 :(得分:1)

您的观察员设计可能会得到改善。将包含视图的控​​制器作为您想要响应的任何内容的观察者似乎更为便利。然后在视图控制器的viewWillDisappear中删除自己作为观察者。

收到通知后,您只需更改表格视图的datasource即可。然后,您可以检查应该获取它的单元格是否可见。如果是,请更新它,否则一旦滚动到视图中,它就会自动显示新信息。