如何从 managedObjectContext 中删除未保存的对象

Posted

技术标签:

【中文标题】如何从 managedObjectContext 中删除未保存的对象【英文标题】:How to remove an unsaved object from a managedObjectContext 【发布时间】:2010-02-14 20:23:57 【问题描述】:

我在使用 iPhone 上的 Core Data 项目时遇到问题。当用户开始添加对象,然后在此过程中取消时,就会出现这种情况。

如果用户点击取消并返回到对象列表,则会在其中列出一个虚拟对象,代表他们正在创建的对象。这永远不会保存到数据库中 - 当用户点击保存按钮时会按预期进行保存。

当加载用户添加数据的视图控制器时,我创建一个新的事物对象 - 这是我要添加的核心数据实体:

myThing = [NSEntityDescription insertNewObjectForEntityForName:@"myThing" inManagedObjectContext:managedObjectContext];

我尝试在取消方法中删除它,如下所示:

[managedObjectContext deleteObject:myThing];

当我这样做时,当我点击取消时,我会得到一个 EXC_BAD_ACCESS。单步执行调试器中的代码,它可以很好地通过取消方法,但是这是在根视图控制器中生成的,在该控制器中我列出了我的对象以及我在尝试创建此对象之前所在的位置。

我想要实现的只是允许用户添加一个新对象,但中途取消。

任何想法是什么导致了这个错误?不幸的是,我无法从中生成堆栈跟踪:(

【问题讨论】:

【参考方案1】:

您的对象取消方法是典型且适当的。

内存错误很常见,而且很难调试。你有没有运行静态分析器?从上下文中删除后,您可能希望将“myThing”引用设置为 nil。

您确定是取消工作流导致了内存错误吗?

【讨论】:

我很确定是取消。如果我进行保存,一切正常。如果我删除 [... deleteObject:myThing];从取消方法,则不再发生崩溃。在这个控制器中使用不同的托管上下文而不是由 RootController 传入的上下文是否有意义? 嗯 - 忽略我之前的评论。在取消方法中设置 myThing = nil 似乎可以解决此问题。我在 dealloc 方法中执行 [myThing release] ,但是仅将其设置为 nil 就使问题消失了。谢谢!【参考方案2】:

您还可以打开 NSZombie 并找出正在访问的已释放对象。这将帮助您快速跟踪此问题。谷歌 NSZombie 获取一些如何使用它的示例。

【讨论】:

以上是关于如何从 managedObjectContext 中删除未保存的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何从 managedObjectContext 中删除未保存的对象

如何从我的视图控制器引用我的 App Delegate 中的 managedObjectContext?

其他视图中的 managedObjectContext

将 ManagedObjectContext 传递/注入到视图控制器中

为啥从 UIApplicationDelegate 获取 ManagedObjectContext 的 Apple 文档不好?

从应用委托中检索 managedObjectContext 时崩溃