孤立的核心数据对象没有被销毁

Posted

技术标签:

【中文标题】孤立的核心数据对象没有被销毁【英文标题】:Orphaned Core Data objects not being destroyed 【发布时间】:2014-03-04 12:46:52 【问题描述】:

我在 Core Data 中有一个 Recipe 对象,它可以容纳一个 Photo 对象。后者包含图像的NSData 属性和一些实用程序属性。

我在更改 PhotoRecipe 时遇到了不便:

recipe.photo = [Photo insertIntoContext: ctxt];

如果 recipe.photonil,则一切正常。但是,如果它以前有Photo 的实例,则该实例将成为“垃圾”,具有nil 配方属性(照片的反比关系)并在保存时导致异常(配方在我的模型中不是可选的)。

因此,我最终不得不做这样的事情:

if(!recipe.photo)
   [ctxt deleteObject:recipe.photo);

recipe.photo = [Photo insertIntoContext: ctxt];

这看起来非常像手动内存管理,我必须确保正确删除“孤立”Photo

一定有更好的方法。我做错了什么?

【问题讨论】:

它看起来并不糟糕,但这是要走的路。系统应该如何知道您是否可能不想再次重复使用该照片,所以它的行为应该是这样的。 【参考方案1】:

您的解决方案有效,并且您的方法正确。 Core Data 不会自动删除悬空的子节点。您将需要明确删除它。然而,“在哪里”就成了问题。

如果您真的总是想在像这样添加新的子对象之前删除现有的子对象,那么我将在 set 访问器的父对象的子类中处理它。这将允许您在执行删除之前检查是否相等等。这也将从您的(可能)视图控制器中删除此维护工作。

更新

好的,谢谢。所以我应该用 setPrimitiveValue 和朋友创建一个自定义设置器?

正确。您还需要准备好 KVO 方法(-willChangeValueForKey:-didChangeValueForKey:),以便您的访问者做正确的事情。

【讨论】:

好的,谢谢。所以我应该用 setPrimitiveValue 和朋友创建一个自定义设置器?【参考方案2】:

另一个更简单的解决方案是将关系的“删除规则”设置为“级联”。那么如果一个对象被删除,则关系另一端的对象会被自动删除。

【讨论】:

以上是关于孤立的核心数据对象没有被销毁的主要内容,如果未能解决你的问题,请参考以下文章

JVM中对象的销毁

Unity:如何通过网络销毁游戏对象?

我怎么能修复MissingReferenceException,它告诉我游戏对象在我没有销毁的时候被破坏了?

第22课.对象的销毁

销毁全局对象[关闭]

如何在 C# 中销毁对象 [重复]