【问题标题】: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

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

【问题讨论】:

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

标签: objective-c cocoa-touch cocoa core-data


【解决方案1】:

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

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

更新

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

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多