我正在开发一个可可应用程序.我正面临一个严峻的问题.
我正在使用以下代码删除Core Data中名为"Directory"的对象的条目:
NSEnumerator *tempDirectories = [[folderArrayController arrangedObjects] objectEnumerator];
id tempDirectory;
while (tempDirectory = [tempDirectories nextObject]){
[managedObjectContext deleteObject:tempDirectory];
}
Run Code Online (Sandbox Code Playgroud)
但有时在删除后尝试保存时会发生类似"核心数据无法解决故障..."的异常.我正在使用代码[managedObjectContext save];
我是Core Data的新手...期待一个解决方案.
这是一个老问题,我已经努力解决这个问题有一段时间了。因此,认为最好将其记录下来。
正如 Weichsel 上面提到的,Apple 文档正确地指出了此异常的原因。但是,识别保留 NSManagedObject 子类的对象的模块是一项繁重的工作(如果文档中第一个引用的原因是问题的根本原因)。
因此,我首先确定代码中保留 NSManagedObject 的部分,而不是保留 NSManagedObjectID 并在需要时从中创建托管对象。类似的讨论可以在 Restkit 文档中找到:
更新了我的 setter 和 getter,以便与其余模块的接口保持相同,而在内部我们现在依赖 NSManagedObjectID 并避免保留 NSManageObject:
-(CSTaskAbstract*)task
{
CSTaskAbstract *theTask = nil;
if (self.taskObjectID)
{
NSManagedObjectContext *moc = [(CSAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
// https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39 &
// https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605
NSError *theError = nil;
NSManagedObject *theObject = [moc existingObjectWithID:self.taskObjectID
error:&theError];
if ([theObject isKindOfClass:[CSTaskAbstract class]])
{
theTask = (CSTaskAbstract*)theObject;
}
}
return theTask;
}
-(void)setTask:(CSTaskAbstract *)inTask
{
if (inTask!=self.task)
{
// Consequences of retaining a MO when it is detached from its MOC
[self setTaskObjectID:[inTask objectID]];
}
}
Run Code Online (Sandbox Code Playgroud)
以上是解决问题的前半部分。我们需要找出应用程序可疑部分的依赖关系并消除。
还有一些其他问题,instruments -> allocates 是一个很好的来源,可以找出哪些模块实际上保留了托管对象,异常对象将包含有关哪个托管对象正在创建问题的详细信息,该对象的过滤结果如下所示:

我们正在对托管对象执行 KVO。KVO 保留观察到的托管对象,因此抛出异常,并且它的回溯不会来自我们的项目内部。这些很难调试,但猜测工作和跟踪对象的分配和保留释放周期肯定会有所帮助。我移除了 KVO 观察部分,一切都开始工作了。
| 归档时间: |
|
| 查看次数: |
12042 次 |
| 最近记录: |