孤立的核心数据对象没有被销毁
Posted
技术标签:
【中文标题】孤立的核心数据对象没有被销毁【英文标题】:Orphaned Core Data objects not being destroyed 【发布时间】:2014-03-04 12:46:52 【问题描述】:我在 Core Data 中有一个 Recipe
对象,它可以容纳一个 Photo
对象。后者包含图像的NSData
属性和一些实用程序属性。
我在更改 Photo
的 Recipe
时遇到了不便:
recipe.photo = [Photo insertIntoContext: ctxt];
如果 recipe.photo
是 nil
,则一切正常。但是,如果它以前有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】:另一个更简单的解决方案是将关系的“删除规则”设置为“级联”。那么如果一个对象被删除,则关系另一端的对象会被自动删除。
【讨论】:
以上是关于孤立的核心数据对象没有被销毁的主要内容,如果未能解决你的问题,请参考以下文章