繁体   English   中英

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

[英]Remove an observer from an UITableViewCell when not used anymore

我转移到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'的函数。)

PS。 打开选中单元格时调用detailViewController时,我需要观察者更新“读取”标签。

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

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

希望能帮助到你。

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

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

您可以改进观察者的设计。 使包含视图的控​​制器成为您要对其作出反应的观察者的方法似乎更为方便。 然后在视图控制器的viewWillDisappear以观察者身份移除自己。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM