我遇到的问题是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!");
}
}
答案 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(请参阅昨天关于该规则的帖子)。