删除后尝试保存时核心数据崩溃
Posted
技术标签:
【中文标题】删除后尝试保存时核心数据崩溃【英文标题】:Core Data Crashes When Trying To Save After Delete 【发布时间】:2010-10-02 15:26:35 【问题描述】:我遇到了无法保存 Core Data 中的上下文的问题。
当我尝试调用 [context save:] 时出现随机崩溃。有时它可以工作,有时它不会并导致应用程序崩溃。这是我的删除代码。通过检查 [context respondsToSelector] 是否保存,我已经能够减少崩溃次数。奇怪的是,即使它失败(respondsToSelector 失败),而且我没有调用保存,它仍然被删除!?但是,当 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】:我假设崩溃意味着 -- EXC_BAD_ACCESS。如果没有,请发布您得到的异常和堆栈跟踪。
EXC_BAD_ACCESS 发生是因为您正在访问错误的内存。通常这是因为您正在访问已释放的内存。追踪它的最简单方法是打开僵尸——这使得所有的 dealloc 什么都不做,但是当你访问一个已经调用了 dealloc 的对象时,它会在控制台中抱怨你正在访问的确切点一个被释放的对象。
我在这里解释了更多关于 EXC_BAD_ACCESS 的内容,以及一些故障排除说明(以及打开僵尸的说明)
http://www.loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html
转到Project->Edit Active Executable,转到Arguments选项卡,在环境变量部分中,添加
NSAutoreleaseFreedObjectCheckEnabled NSZombieEnabled NSDebugEnabled
并将每个设置为“是”。你可以不选中它们,但是如果你选中它们,那么你的应用程序现在将对自动释放和释放进行一些额外的检查,并在你做错时给你一个很好的堆栈跟踪。一个常见的问题是认为您需要在对象已经设置为自动释放时调用释放(请参阅昨天的帖子,了解规则是什么)。
【讨论】:
我没有获得错误的访问权限,而是获得了 SIG-BIT。但是您添加环境变量的提示是我需要弄清楚它为什么崩溃的原因。出于某种原因,我过早地释放了一个日期对象然后访问它。当 Core Data 去保存它时,它已经不存在并且崩溃了。我通过使日期对象成为自动发布对象 [NSDate 日期] 来解决这个问题。它现在似乎起作用了。启用 environ 变量后,我收到一条控制台消息,说我正在向已发布的日期对象发送消息,这是我需要的提示。以上是关于删除后尝试保存时核心数据崩溃的主要内容,如果未能解决你的问题,请参考以下文章
iPhone - 在删除 CoreData 中的对象后尝试保存新对象时应用程序崩溃