Iphone 尝试从核心数据中删除时的EXC_内存访问($现金解决方案)

Iphone 尝试从核心数据中删除时的EXC_内存访问($现金解决方案),iphone,objective-c,core-data,Iphone,Objective C,Core Data,我有一个应用程序,可以下载xml文件,解析文件,并在执行此操作时创建核心数据对象。在解析代码中,我有一个名为“emptydatacontext”的函数,它在从xml数据创建替换项之前从核心数据中删除所有项。此方法如下所示: -(void) emptyDataContext { NSFetchRequest * allCon = [[NSFetchRequest alloc] init]; [allCon setEntity:[NSEntityDescription entityForName:@

我有一个应用程序,可以下载xml文件,解析文件,并在执行此操作时创建核心数据对象。在解析代码中,我有一个名为“emptydatacontext”的函数,它在从xml数据创建替换项之前从核心数据中删除所有项。此方法如下所示:

-(void) emptyDataContext
{
NSFetchRequest * allCon = [[NSFetchRequest alloc] init];
[allCon setEntity:[NSEntityDescription entityForName:@"Condition" inManagedObjectContext:managedObjectContext]];
NSError * error = nil;
NSArray * conditions = [managedObjectContext executeFetchRequest:allCon error:&error];
DebugLog(@"ERROR: %@",error);
DebugLog(@"RETRIEVED: %@", conditions);
[allCon release];

for (NSManagedObject * condition in conditions) {
    [managedObjectContext deleteObject:condition];
}

// Update the data model effectivly removing the objects we removed above.
//NSError *error;
if (![managedObjectContext save:&error]) {
    DebugLog(@"%@", [error domain]);
}
}

第一次运行时,它会删除所有应该删除的对象和函数——从xml文件中创建新对象。我创建了一个“更新”按钮,它在继续解析和构建时启动检索文件的完全相同的过程。在删除核心数据对象之前一切正常。此“deleteObject”调用每次都会创建一个“EXC\u BAD\u ACCESS”错误。这只发生在第二次到第二次

捕获的错误返回null。如果我记录“conditions”数组,我将在第一次运行时获得NSManagedObject的列表。在第二次日志请求时,会导致崩溃,与deleteObject调用完全相同

我有一种感觉,这是一件非常简单的事情,我错过或没有正确地做,导致这种行为。这些数据在我的TableView上非常有效——只有在尝试更新时,我才会崩溃

我花了几天&几天的时间在这方面尝试了许多替代方法。我剩下的头发都掉了。我愿意为任何愿意查看我的代码并了解我做错了什么的人提供一些现金。只需要越过这个障碍


提前感谢您的帮助

删除for循环中的对象后是否保存了上下文?请注意,
deleteObject:
不会立即删除该对象,它只是在提交更改时(即保存上下文时)计划将其删除


编辑:您的问题可能与如何在表视图中向用户显示数据有关。如果没有额外的代码,很难准确判断(您是否使用NSFetchedResultsController?),但我猜删除数据和在表中显示数据之间的交互是不正确的。可能发生的情况是,您的表被告知要可视化您的数据,但是当您删除它们时,您没有正确地更新表

哇,所以经过几天的测试,我走上了一条追踪僵尸和内存管理的道路。在这种情况下,我收到的错误是另一个领域的问题遗留下来的。当解析数据并将其放入核心数据时,我释放了一个要自动释放的对象。因此,对核心数据中该项的任何后续调用(save、deletec等)都会导致崩溃。谢谢大家的帮助,我发誓会密切关注我的内存管理调用。

您应该捕获并记录从提取返回的错误,这是理所当然的。您可以在没有nil数组的情况下获得错误。试试看,看看它是否提供了任何线索。谢谢你的提示。在“delete”for循环之后,我立即执行以下命令:如果(![managedObjectContext save:&error]){DebugLog(@“%@”,[error domain]);},那么对于第一次迭代,我的对象被提交。在第二次迭代中,由于For循环中的第一个deleteObject调用导致系统崩溃,所以我们没有达到这一点。根据TechZen的建议,我将尝试调查取回的线索。