ios - 我应该使用weak 让UICollectionViewCell 持有一个NSManagedObject,以避免干扰CoreData 内存管理吗?
问题描述
目前,我有以下核心数据支持的集合视图,使用户能够执行添加/删除/修改/重新排序。
UICollectionViewCell
如果我让, 持有其对应的 ,实现我的东西会方便得多NSManagedObject
。这样我每个人都可以执行添加/删除/修改/重新排序。
我想知道,我是否应该将其标记NSManagedObject
为弱,以避免干扰 CoreData 如何管理其内存?
使用弱
class TabInfoSettingsCell: UICollectionViewCell {
// NSManagedObject. Use weak, as we do not want to inteference with how CoreData manage its memory.
private weak var nsTabInfo : NSTabInfo?
或者,这种担心是无效的。我们可以简单地使用 strong
使用强
class TabInfoSettingsCell: UICollectionViewCell {
// NSManagedObject.
private var nsTabInfo : NSTabInfo?
或者,这种担忧是有效的并且使用弱是不安全的(因为在某些极端情况下它可能会变为 nil?)。我们可以使用一个结构,它包含包括 objectID 在内的所有内容,但不包括NSManagedObjectContext
.
使用结构
class TabInfoSettingsCell: UICollectionViewCell {
// struct. Contains everything including objectID, but excluding NSManagedObjectContext.
private var tabInfo : TabInfo?
这伴随着NSManagedObject
每次都必须在 cellForItemAt 中创建一个结构的成本。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
...
tabInfoSettingsCell.update(nsTabInfo.toTabInfo())
...
}
我可以知道,就安全内存管理而言,哪个是正确的设计?
解决方案
当您使用NSFetchedResultsController
backedUICollectionView
时,所有对象的生命周期都是由您驱动的,NSFetchedResultsController
而您无需担心这些情况。
每次您的商店发生变化时,您都会收到有关该变化的通知,并且您可以要求NSFetchedResultsController
为您提供最新数据。
你不需要太担心一个单元格对模型有很强的引用。无论如何都会重用单元格,并且每次重用单元格时,此引用都会不断变化。
您可以在单元格中使用对模型的强引用,这不会给您带来问题,因为单元格会根据设计使用最新数据进行刷新。
推荐阅读
- python - 如何分解条件的数据框行?
- reporting-services - SSRS - tablix 中的第一行边框未加粗
- jquery - 首先在给定的行对象中插入列
- c - 未分配的#defines 是否隐式分配为 0?
- python-3.x - 根据另一列的值在数据框的列上应用函数,然后按 groupby
- excel - 将 excel 转换为特定类型的 XML 格式?
- git - 如何将 core.sshCommand 选项传播到子模块更新?
- c# - 在应用服务层访问 HttpContext
- visual-studio-code - vscode 查找选项卡始终转到要包含的文件
- docker - Docker克隆mysql镜像进行备份