在迁移到 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
(原型(prototype)单元格只有一个名为“populateCell”的函数。)
附言。我需要观察者在打开选择单元格时调用的 detailViewController 时更新“读取”标签。
最佳答案
您很可能不想在您的手机上使用观察器。为什么不?您的细胞正在被重复使用。假设您的 TableView 中有 400 个项目。在任何给定时间,屏幕上只会显示大约 8 个。这意味着只有 8 或 9 个单元格实例会保留在内存中并在用户滚动时重新使用。这意味着每次单元格滚出 View 时您都必须删除观察器,并且您需要为重新使用的单元格添加一个新的观察器。您可以通过覆盖单元格的 prepareForReuse
方法来做到这一点。但是,保存任何类型的状态(例如将单元格标记为“已读”)不应在单元格中完成,而应在您的模型中完成。
由于在您的情况下,用户操作触发了 read
状态的更新,您可以简单地将数据模型项设置为 tableView:didSelectRowAtIndexPath 中的
然后通过调用自定义单元格上的自定义方法或调用 read
: [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
希望对您有所帮助。
关于ios - 不再使用时从 UITableViewCell 中移除观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20003146/