我的应用程序应该只使用一个托管对象上下文

时间:2011-06-20 04:23:51

标签: ios core-data nsmanagedobjectcontext

我的应用程序是否适合拥有多个托管对象上下文?我正在走这条路,(从我的MOC从UIViewController子类的一个实例传递到下一个,但是我开始遇到EXC_BAD_ACCESS错误,我想知道它是否相关。

那么,我什么时候想要使用多个ManagedObjectContexts?(何时)我应该只使用一个?

修改

在我基于UISplitViewController的应用中,当在主视图中显示第二个视图后,在我的主视图中删除行时,仅 ,我的详细视图控制器在{{1我永远不会打电话给你。

编辑2:

基本上,我有一个主视图和一个详细视图。在详细视图中,用户按下按钮。该按钮显示“新交易”视图。我没有以模态方式呈现视图,而是手动将其添加到详细视图中。如果用户在此新视图中更改了托管对象上下文,然后尝试删除主视图中的行,则会导致崩溃。如果我以模态方式呈现相同的视图,一切正常。

此外,NSZombieEnabled表示正在(父)详细信息视图上调用respondsToSelector方法。我不会在我的应用程序中的任何地方打电话。这可能是一个记忆问题吗?线程问题?我没有显式创建任何新线程,但我不知道是否在幕后创建了任何线程。

可能是什么问题?

EDIT3:

这个问题似乎变得更好了。在我的详细视图中,我还有一个表,与主视图一样,它使用NSFetchedResults控制器。当我删除单元格时,我也隐藏了详细视图,导致它被释放。释放详细信息视图会导致应用崩溃。如果我不删除详细信息视图,则会删除详细信息视图表中的事务。 (这是因为我将Core Data设置为在删除帐户时级联。)

那么,也许我有太多respondsToSelector个对象?我相信发生的事情如下:

当我删除一行时,NSFetchResultsController值会发生变化,因此它会尝试触发委托方法。但是,详细视图已被删除,并且视图控制器已取消分配。因此,委托系统触发controllerDidChange方法,并在尝试将通知传递给详细信息视图时崩溃。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

一般来说,你应该只使用一个,除非你需要从多个线程访问数据,在这种情况下你需要每个线程一个。

你当然不需要为每个UIViewController创建一个。

您可能还想重新考虑是否应该将整个托管对象上下文传递给UIViewController - 如何只传递它需要的模型对象来完成它的工作?