Core data &引用;核心数据无法实现故障……”;错误

Core data &引用;核心数据无法实现故障……”;错误,core-data,Core Data,我正在开发一个可可应用程序。我面临一个关键问题 我正在使用以下代码删除核心数据中名为“目录”的对象的条目: NSEnumerator *tempDirectories = [[folderArrayController arrangedObjects] objectEnumerator]; id tempDirectory; while (tempDirectory = [tempDirectories nextObject]){ [managedObjectContext delete

我正在开发一个可可应用程序。我面临一个关键问题

我正在使用以下代码删除核心数据中名为“目录”的对象的条目:

NSEnumerator *tempDirectories = [[folderArrayController arrangedObjects] objectEnumerator];
id tempDirectory;
while (tempDirectory = [tempDirectories nextObject]){
    [managedObjectContext deleteObject:tempDirectory];
}
但有时在删除后尝试保存时会出现异常,如“核心数据无法完成故障…”。我正在使用代码
[managedObjectContext save]


我是新的核心数据。。。期待解决。

这是一个老问题,我一直在努力解决这个问题。因此,我认为最好将其记录下来

正如上面提到的,魏克塞尔正确地指出了这一例外的原因。但是,确定NSManagedObject子类的对象被保留的模块是一项繁忙的工作(如果文档中引用的第一个原因是问题的根本原因)

因此,我首先确定代码中保留NSManagedObject的部分,而不是保留NSManagedObject,并在需要时从中创建托管对象。类似行中的讨论可在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]];
        }
    }
    
    以上是问题解决的前半部分。我们需要找出应用程序中可疑部分的依赖性,并消除这些依赖性

    还有一些其他问题,instruments->allocations是一个很好的来源,可以找出哪些模块实际保留了托管对象,exception对象将包含有关哪个托管对象产生问题的详细信息,该对象的筛选结果如下所示:


    我们在一个托管对象上执行KVO。KVO保留观察到的托管对象,因此会引发异常,并且它的回溯跟踪不会来自我们的项目中。这些都很难调试,但猜测工作和跟踪对象的分配以及保留发布周期肯定会有所帮助。我删除了KVO观察部分,所有部分都开始工作。

    看看这里的第三段:但是如何调试并找出导致此异常的确切模块?