删除后尝试保存时核心数据崩溃

时间:2010-10-02 15:26:35

标签: objective-c core-data ios

我遇到的问题是Core Data中的上下文无法保存。

当我尝试调用[context save:]时,我会随机崩溃。有时它可以工作,有时它不会和应用程序崩溃。这是我的删除代码。通过检查[context respondsToSelector]是否保存,我已经能够减少崩溃次数。奇怪的是,即使失败(respondsToSelector失败),我没有调用save,它仍然会被删除!?但是当respondsToSelector成功,并且我尝试调用save时,它仍然会崩溃。所以代码在测试时更稳定一些,但我认为Core Data和save方法有问题。追踪这个问题非常困难,因为它看起来确实是随机的。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the managed object.
        NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
        Accidents* accidentDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
        [context deleteObject:accidentDelete];

        // Causing crash...
        NSError *error = nil;

        if ([context respondsToSelector:@selector(save:)])
            if (![context save:&error]) {
                // Update to handle the error appropriately.
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
                exit(-1);  // Fail
            }
        else
            NSLog(@"Error! Context does not respond to save!");   
    }
} 

1 个答案:

答案 0 :(得分:3)

我假设崩溃意味着 - EXC_BAD_ACCESS。如果没有,请发布您获得的异常和堆栈跟踪。

EXC_BAD_ACCESS发生是因为您正在访问不良内存。通常这是因为您正在访问释放的内存。跟踪它的最简单方法是打开僵尸 - 这使得所有deallocs什么都不做,但是当你访问一个已经调用了dealloc的对象时,它会在控制台中抱怨,具体点是你可以访问一个自由的对象。

我在这里解释了很多关于EXC_BAD_ACCESS的信息,包括一些故障排除说明(以及打开僵尸的说明)

http://www.loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html

  

转到Project->编辑Active Executable,转到Arguments选项卡和环境变量部分,添加

NSAutoreleaseFreedObjectCheckEnabled 
NSZombieEnabled    
NSDebugEnabled 
     

并将每个设置为YES。您可以将它们留在那里取消选中,但是如果您检查它们,那么您的应用程序现在将对自动释放和释放进行一些额外的检查,并在您完成错误时为您提供良好的堆栈跟踪。一个常见的问题是,当对象已经设置为自动释放时,您需要调用release(请参阅昨天关于该规则的帖子)。