CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获到异常
Posted
技术标签:
【中文标题】CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获到异常【英文标题】:CoreData: error: Serious application error. Exception was caught during Core Data change processing 【发布时间】:2013-01-03 07:36:01 【问题描述】:我在开发我的 iphone 应用程序时遇到了重大问题。
这是完整的错误:
CoreData: error: Serious application error. Exception was caught during Core Data
change processing. This is usually a bug within an observer of
NSManagedObjectContextObjectsDidChangeNotification. -[TimeSpentStudying coordinate]:
unrecognized selector sent to instance 0x21db92d0 with userInfo (null)
这很奇怪,因为我有两个 coreData 实体(Locations 和 TimeSpentStudying)。但我不认为这些是问题。 [TimeSpentStudying coordinate]
很奇怪,因为我没有在 TimeSpentStudying
核心数据类上发送 coordinate
属性
我设置了一个 mapView,当用户点击 mkannotationview 上的详细信息披露按钮时,会弹出一个新视图 (LibraryTrackTimeViewController),但几乎无法使用。我尝试在 viewDidLoad 中调用 NSLog,但没有任何显示。
mapViewController.m
#pragma mark - NSNotification
- (void)contextDidChange:(NSNotification *)notification
if ([self isViewLoaded])
[self updateLocations];
.
- (void)updateLocations
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
NSError *error;
NSArray * foundObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (foundObjects == nil)
FATAL_CORE_DATA_ERROR(error);
return;
if (locations != nil)
[self.mapView removeAnnotations:locations];
locations = foundObjects;
[self.mapView addAnnotations:locations];
-(void)dealloc
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSManagedObjectContextObjectsDidChangeNotification
object:self.managedObjectContext];
我认为可能与 mapViewController.m 中的 prepareForSegue 方法有关的错误
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if (distance < 500)
if ([segue.identifier isEqualToString:@"TrackLibraryTimes"])
UINavigationController *navigationController = segue.destinationViewController;
LibraryTrackTimeViewController *controller = (LibraryTrackTimeViewController *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
对于粗略的语法我很抱歉,我只是习惯了,如果您需要更多代码,请告诉我,谢谢。
【问题讨论】:
您好,欢迎您!另外,好问题! 错误消息明确指出coordinate
消息被发送到TimeSpentStudying
的一个实例,可能是地址为0x21db92d0的对象。因此,在某些时候,您正在使用 TimeSpentStudying
对象,其中需要不同的类型 (Locations
?)。由于 Objective-C 中的动态方法解析,此类问题通常仅在运行时才被发现。您应该尝试定位问题,例如通过在所有 Objective-C 异常上设置断点。
【参考方案1】:
我有同样的错误,由于
-(void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
case NSFetchedResultsChangeInsert:
//[self.tableView insert
NSLog(@"change insert");
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
break;
我使用了indexPath
而不是 newIndexPath。
【讨论】:
谢谢道格,你救了我的培根【参考方案2】:通过解除分配获取的结果控制器解决了这个问题。当我在单独的屏幕中添加/编辑对象时,它仍在执行提取。
【讨论】:
【参考方案3】:根据您的项目的复杂性,一个快速的方法是实现有问题的方法并在那里设置一个断点。当您遇到断点时,您可以看到它被调用的位置,并且 Bob 是您的叔叔。
所以你可以放类似的东西
- (CLLocationCoordinate2D)coordinate
// set a breakpoint on the next line
NSParameterAssert(false);
return nil;
在你的 TimeSpentStudying
类中,看看它在哪里被调用。
请确保在完成后将其删除。
【讨论】:
【参考方案4】:我会尝试几件事。
从模拟器中删除应用程序并清理应用程序并再次运行。
查看您的代码,我觉得您正在将 managedContextObject 从一个控制器传递到另一个控制器,无需这样做。用户 AppDelegate sharedInstance 可以随时获取 managedObject。它不会创建多个实例,它是一个单例对象。
试试这两个,希望你能找到一些答案或者修复它。
【讨论】:
投了反对票,因为你实际上永远不想使用 Core Data 这样做,并且总是使用 Apple 推荐的“传递接力棒”方法绕过 MOC。以上是关于CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获到异常的主要内容,如果未能解决你的问题,请参考以下文章
Swift CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获到异常。
controllerDidChangeContent 处的核心数据严重应用程序错误
核心数据:NSFetchedResultsController 错误:尝试创建两个动画