首页 > 解决方案 > 我应该使用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())
    ...
}

我可以知道,就安全内存管理而言,哪个是正确的设计?

标签: iosswiftcore-data

解决方案


当您使用NSFetchedResultsControllerbackedUICollectionView时,所有对象的生命周期都是由您驱动的,NSFetchedResultsController而您无需担心这些情况。

每次您的商店发生变化时,您都会收到有关该变化的通知,并且您可以要求NSFetchedResultsController为您提供最新数据。

你不需要太担心一个单元格对模型有很强的引用。无论如何都会重用单元格,并且每次重用单元格时,此引用都会不断变化。

您可以在单元格中使用对模型的强引用,这不会给您带来问题,因为单元格会根据设计使用最新数据进行刷新。


推荐阅读