在重复上下文中编辑NSManagedObject以稍后合并它

时间:2011-04-21 18:33:11

标签: objective-c core-data nsmanagedobjectcontext

当用户双击我的应用程序中的视图时,uipopovercontroller会向他显示他可以编辑的字段。 (就像iPad日历应用程序一样)

该视图代表NSmanagedobject。为了能够取消在uipopovercontroller中完成的操作,我的想法如下:

1)在我的viewcontroller中为popover创建一个“editManagedObjectContext”,并为其提供我在整个应用程序中使用的主要上下文的persistentstorecoordinator。

editContext = [[NSManagedObjectContext alloc] init];
[editContext setPersistentStoreCoordinator:[myContext persistentStoreCoordinator]];

2)从新的“editContext”中获取点击视图(Task *)上表示的对象

task = [editContext objectWithID:[taskOrNilForNewTask objectID]];

3)使用此任务进行所有编辑,当用户完成时,他可以:

  1. 取消整个编辑操作。这只会丢弃editContext并返回。
  2. 保存。这将通过mergeChangesFromContextDidSaveNotification :将editcontext与原始上下文合并。 从而将更改提交到原始上下文中的相应任务。
  3. 问题是task = [editContext objectWithID:[taskOrNilForNewTask objectID]]; 导致出现故障的对象。后来当我尝试访问任务对象的属性时,我得到了BAD_EXC错误或我的任务对象似乎是一些奇怪的类型,范围从:CALayer,NSCFData,...

    我的想法是,我可能必须先保存原始上下文,但这会导致大致相同的错误。但是因为我在创建editContext之前保存了,我认为保存操作可以在另一个线程中完成,这可能是一个原因?

    我无法理解我做错了什么,希望你们能提出一些建议。

    我的方法基于Apple的CoreDataBook代码示例中的方法(rootviewcontroller.m - (IBAction)addBook :)。

1 个答案:

答案 0 :(得分:1)

您的问题是objectWithID:返回一个自动释放的对象,然后您将其存储在ivar中而不保留它。系统后来取消分配它,要么你得到一个垃圾,给你EXC_BAD_ACCESS,或者你在同一个内存位置与一个不同的对象巧合。您描述的错误清楚地表明了这一点。

self.task修复它的原因是因为属性self.task被声明为retain,所以通过属性自动分配会自动执行必要的保留。请注意,如果你没有在dealloc中释放它,那么你将会泄漏记忆。