我的应用有多个托管对象上下文是否合适?我正在走这条路线,(将我的MOC从一个UIViewController子类的实例传递到下一个实例),但是我开始遇到EXC_BAD_ACCESS错误,我想知道它是否可能是相关的。我的应用程序应该只使用一个托管对象上下文吗?
那么,什么时候我想使用多个ManagedObjectContexts,并且(何时)我应该只使用一个?
编辑:
以我UISplitViewController
基于应用程序,上respondsToSelector
呈现第二视图的主要细节视图内,我的细节视图控制器崩溃后删除我的主视图的一个行,仅时,这我永远不会打电话。
编辑2:
基本上,我有一个主视图和细节图。在详细视图中,用户按下按钮。该按钮带来了“新交易”视图。我不是以模态方式呈现视图,而是手动将其添加到详细视图。如果用户在此新视图中更改托管对象上下文,然后尝试删除主视图中的行,则会导致崩溃。如果我以模态方式呈现相同的视图,则一切正常。此外,NSZombieEnabled表示在(父)详细视图上调用respondsToSelector
方法。我不会在我的应用程序的任何地方打电话。这可能是一个记忆问题吗?线程问题?我没有明确地创建任何新线程,但我不知道是否有任何线程在幕后创建。
可能是什么问题?
EDIT3:
这个问题似乎变得更好。在我的详细视图中,我也有一张表,它像主视图一样使用NSFetchedResults控制器。当我删除单元格时,我也隐藏了详细信息视图,导致它被释放。释放细节视图会导致应用程序崩溃。如果我不删除详细视图,则详细视图表中的交易将被删除。 (这是因为我的核心数据设置为级联时删除一个帐户。)
因此,也许我有太多的NSFetchResultsController
对象?我相信现在发生的事情如下:
当我删除一行时,NSFetchResultsController值发生变化,所以它试图触发委托方法。但是,详细视图已被删除,并且视图控制器已解除分配。因此,委托系统触发controllerDidChange方法,并在尝试将通知传递给详细视图时崩溃。
我该如何解决这个问题?
如果您在两个线程之间共享托管对象,则有时会发生EXC_BAD_ACCESS,但可能存在其他内存管理问题。尝试在模拟器中使用NSZombiesEnabled = YES运行以查看您的应用尝试访问的对象。 – ImHuntingWabbits
@ImHuntingWabbits - 在我的分割视图应用程序中,在我的主视图上删除一行时,我的详细视图控制器在'respondsToSelector'上崩溃,我永远不会调用它。我的创建对象的视图应该直接访问委托的ManagedObjectContext。 – Moshe
如果我理解正确,那么您的数据模型就有一个托管对象上下文,并且左侧列表视图和您的详细视图都共享相同的上下文对象。当您试图向详细信息视图中的上下文添加新的托管对象时,尝试删除列表视图中的一行时,您会遇到崩溃。这不是一个线程问题,因为你不是自己创建新线程,所以你不应该在这里需要更多的上下文。您的左侧列表视图是通过NSFetchedResultsController处理的吗?如果是这样,它是否正确地听取上下文更新? –