当用户双击我的应用程序中的视图时,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)使用此任务进行所有编辑,当用户完成时,他可以:
mergeChangesFromContextDidSaveNotification :
将editcontext与原始上下文合并。
从而将更改提交到原始上下文中的相应任务。问题是task = [editContext objectWithID:[taskOrNilForNewTask objectID]];
导致出现故障的对象。后来当我尝试访问任务对象的属性时,我得到了BAD_EXC错误或我的任务对象似乎是一些奇怪的类型,范围从:CALayer,NSCFData,...
我的想法是,我可能必须先保存原始上下文,但这会导致大致相同的错误。但是因为我在创建editContext之前保存了,我认为保存操作可以在另一个线程中完成,这可能是一个原因?
我无法理解我做错了什么,希望你们能提出一些建议。
我的方法基于Apple的CoreDataBook代码示例中的方法(rootviewcontroller.m - (IBAction)addBook :)。
答案 0 :(得分:1)
您的问题是objectWithID:
返回一个自动释放的对象,然后您将其存储在ivar中而不保留它。系统后来取消分配它,要么你得到一个垃圾,给你EXC_BAD_ACCESS,或者你在同一个内存位置与一个不同的对象巧合。您描述的错误清楚地表明了这一点。
self.task
修复它的原因是因为属性self.task
被声明为retain,所以通过属性自动分配会自动执行必要的保留。请注意,如果你没有在dealloc
中释放它,那么你将会泄漏记忆。