我有一个简单的方法,只需要两个托管对象ID,为它们提取托管对象,建立关系,然后将它们保存到managedObjectContext中。
当我在managedObjectContext上执行保存时,调试器在保存行上停止,并且objc_exception_throw引用nsmanagedObjectContext保存。虽然输出的nserror对象中没有输出来给我任何有关抛出异常的详细信息。它看起来好像这个保存工作正常,这使得这更令人困惑。
以下是有问题的方法......
- (void)relateLocationToInvite:(NSManagedObjectID *)locationID :(NSManagedObjectID *)inviteID {
NSManagedObject *invite = [self.managedObjectContext objectWithID:inviteID];
NSManagedObject *locationObj = [self.managedObjectContext objectWithID:locationID];
Location *location = (Location *)locationObj;
[invite setValue:location forKey:@"location"];
NSError *error = nil;
if( ![self.managedObjectContext save:&error] ){
NSLog(@"Error relating a location to an invite %@",error);
}
}
答案 0 :(得分:8)
如果在save:
方法之后继续执行应用程序没有任何问题(即没有抛出任何未捕获的异常且没有报告任何错误),这意味着保存操作的实现已捕获异常并决定默默忽略它
为什么会发生这种情况还不清楚:可能实现依赖于报告内部错误的异常(这不是应该使用Objective-C异常的方式,而是一些其他语言更多地使用异常)。只要异常在到达您自己的代码之前被捕获,您就不必担心它。
如果您想知道异常的原因,可以在objc_exception_throw
上中断并使用以下调试器命令:
po *(id *)($ebp + 8)
这将显示iOS模拟器(x86架构)中为该函数指定的NSException *
参数。在设备(arm架构)上,使用(如果我的记忆正确地为我服务)可以实现相同的结果:
po $r0