2011-06-20 21 views
0

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

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

编辑:

以我UISplitViewController基于应用程序,上respondsToSelector呈现第二视图的主要细节视图内,我的细节视图控制器崩溃后删除我的主视图的一个行,时,这我永远不会打电话。

编辑2:

基本上,我有一个主视图和细节图。在详细视图中,用户按下按钮。该按钮带来了“新交易”视图。我不是以模态方式呈现视图,而是手动将其添加到详细视图。如果用户在此新视图中更改托管对象上下文,然后尝试删除主视图中的行,则会导致崩溃。如果我以模态方式呈现相同的视图,则一切正常。此外,NSZombieEnabled表示在(父)详细视图上调用respondsToSelector方法。我不会在我的应用程序的任何地方打电话。这可能是一个记忆问题吗?线程问题?我没有明确地创建任何新线程,但我不知道是否有任何线程在幕后创建。

可能是什么问题?

EDIT3:

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

因此,也许我有太多的NSFetchResultsController对象?我相信现在发生的事情如下:

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

我该如何解决这个问题?

+0

如果您在两个线程之间共享托管对象,则有时会发生EXC_BAD_ACCESS,但可能存在其他内存管理问题。尝试在模拟器中使用NSZombiesEnabled = YES运行以查看您的应用尝试访问的对象。 – ImHuntingWabbits

+0

@ImHuntingWabbits - 在我的分割视图应用程序中,在我的主视图上删除一行时,我的详细视图控制器在'respondsToSelector'上崩溃,我永远不会调用它。我的创建对象的视图应该直接访问委托的ManagedObjectContext。 – Moshe

+0

如果我理解正确,那么您的数据模型就有一个托管对象上下文,并且左侧列表视图和您的详细视图都共享相同的上下文对象。当您试图向详细信息视图中的上下文添加新的托管对象时,尝试删除列表视图中的一行时,您会遇到崩溃。这不是一个线程问题,因为你不是自己创建新线程,所以你不应该在这里需要更多的上下文。您的左侧列表视图是通过NSFetchedResultsController处理的吗?如果是这样,它是否正确地听取上下文更新? –

回答

4

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

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

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

+0

如果我没有为每个视图控制器创建一个,我该如何执行数据插入和查询?只需在应用程序委托中定义方法,那么我应该在通知中传递数据还是其他内容? – Moshe

+1

@Moshe:同一个上下文可以被多个视图控制器共享,只要它们都在同一个线程中运行。通常情况下,您甚至不需要直接访问上下文 - 管理对象知道它们属于哪个上下文,所以如果修改它,它会做正确的事情。例如,您可以通过访问“员工”对象来将“人员”对象添加到“员工”列表中。如果你有一个显示员工列表的视图控制器,你可以通过给它设置'员工'列表来设置它 - 你不需要明确地给它上下文。 – Caleb

+0

@Caleb - 我可以通过托管对象访问上下文吗? – Moshe

相关问题