ios - 不再使用时从 UITableViewCell 中移除观察者

标签 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

(原型(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/

相关文章:

ios - 对多个 iBeacon 使用react

ios - Xcode 6.3 警告

iphone - 水平旋转的iphone uipickerview?

iphone - iOS/Obj-C UIScrollView View 未正确添加

iphone - 如何在 iPhone 中实现 NFC(近场通信)?

ios - 不兼容的指针类型将 'UITapGestureRecognizer *' 发送到类型 'UIView * _Nonnull' 的参数

ios - swift 1.2 : GAI -> Cannot invoke 'send' with an argument list of type '(NSMutableDictionary!)'

ios - iOS 中来自 JSON 的响应不完整

ios - 异步下载 - 右模式

ios - 从 CallKit 禁用添加调用选项