【发布时间】:2013-11-15 14:19:54
【问题描述】:
在迁移到 ARC 后,我正在尝试调整我的项目。 我最大的问题是目前由于循环引用而没有释放对象。例如。在 UIView 上,不会调用 dealloc(我以前用它来释放对象并将它们置于 nil 上,因为这些对象正在阻止 dealloc。
对于 UIViews,我可以对“ViewDidDisappear”执行一些逻辑并确定不再需要它,但现在我遇到了 UITableViewCells 的问题。在一个中,我有一个通知观察者,如果创建了观察者,该单元格将保留在内存中。
检测是否不再需要(例如) 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”的函数。)
附言。当打开选择单元格时调用的 detailViewController 时,我需要观察者更新“读取”标签。
【问题讨论】:
-
当您不希望引用使对象保持活动状态时,将代码设计为使用弱引用。
-
你真的需要观察者吗?
-
我需要观察者更新 tableview 上的“读取”标志。加载详细视图时,该项目被标记为已读,并且观察者由 ManagedObjectContextSave 通知触发并更新标签。我没有成功让另一个观察者更新 tableviewcell(当不在视图中时)。 NSFetchedResultsController 似乎没有在 tableview 上触发它,尽管它可能应该。
-
如果所有单元格的行为都相同,则应在 UITableViewCell 的
dealloc方法中删除观察者。如果不同的单元格表现不同,您应该在单元格的prepareForReuse方法中将其删除。 -
我认为除非释放单元格,否则不会在 ARC 中调用 dealloc,这仅在删除观察者后才会发生。但我可以准备 prepareForReuse 并查看何时触发。
标签: ios iphone objective-c uitableview automatic-ref-counting