Iphone 核心数据:严重的应用程序错误

Iphone 核心数据:严重的应用程序错误,iphone,core-data,nsfetchedresultscontroller,nsmanagedobjectcontext,Iphone,Core Data,Nsfetchedresultscontroller,Nsmanagedobjectcontext,我正在完成我的核心数据应用程序,我开始了我的最终测试 每一件事都很好,除了一件事,那是随机发生的,我无法复制它 以下是日志(已启用NSZombie): 2011-07-03 20:27:53.144 MYAPP[1882:707]-[\uu NSCFType controllerWillChangeContent:]:发送到实例0x4a4c490的无法识别的选择器 2011-07-03 20:27:53.149 MYAPP[1882:707]严重的应用程序错误。在核心数据更改处理期间捕获异常。这

我正在完成我的核心数据应用程序,我开始了我的最终测试

每一件事都很好,除了一件事,那是随机发生的,我无法复制它

以下是日志(已启用NSZombie):

2011-07-03 20:27:53.144 MYAPP[1882:707]-[\uu NSCFType controllerWillChangeContent:]:发送到实例0x4a4c490的无法识别的选择器
2011-07-03 20:27:53.149 MYAPP[1882:707]严重的应用程序错误。在核心数据更改处理期间捕获异常。这通常是NSManagedObjectContextObjectsIDChangeNotification的观察者中的错误-[\uu NSCFType controllerWillChangeContent:]:发送给实例0x4a4c490的无法识别的选择器带有userInfo(null)
2011-07-03 20:27:53.165 MYAPP[1882:707]CoreAnimation:忽略异常:-[\uu NSCFType controllerWillChangeContent:]:发送到实例0x4a4c490的选择器无法识别
它在这里崩溃:

NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; // IT'S OK
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"Kontrahent" inManagedObjectContext:context]; // IT'S OK
for(NSString *key in kontrahent) [newManagedObject setValue:[kontrahent valueForKey:key] forKey:key];  // IT'S OK
NSError *error = nil;
if (![context save:&error]) {  // IT'S NOT OK
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
我的操作层次结构:

1。公开申请
2.打开我的“根”列表(使用NSFetchedResultsController,实体:“Faktura”)
3.点击“添加”按钮
4.在“添加”视图控制器中,我创建了另一个对象(实体:“Kontrahent”)
5.我尝试将其添加到数据库中
6.它崩溃了/没有。
方案:
+---[moc save::]->Faktury(我的根类)
|                        ↓

+-----delegate--FakturaCreator看起来像是您正在保留指向一个对象的指针,该对象在您有机会使用它之前已从内存中删除。确保您保留了任何否则会自动删除的对象

从崩溃日志看,NSFetchedResultsController委托的指针似乎指向已释放的内存


保存时是否存在FakturaCreator和KontrahentCreator?在应用程序的dealloc方法中设置陷阱,查看是否一切正常。

如果您的任何核心数据对象中都有一个nil值,也可能发生这些崩溃。最好在保存之前查看每个对象,以确保所有属性都有值(即,不显示nil或“…not nil…”,这表示对象不符合NSCoding)。如果是这种情况,您可以简单地为属性添加一个默认值,这样它们就永远不会为零,然后边走边分配它们。我有一个“KontrahentPicker”,它还有
NSFetchedResultsController
。但是这个
UIViewController
显示为
modalViewController
。我皱起我的
Kontrahent
,莫代尔被解雇并释放。但NSFRC的委托仍处于活动状态

我把我的问题解决了

self.fetchedResultsController.delegate = nil;

-dealloc
方法中。

是的,它们存在
NSFetchedResultsController
是在我的根目录中实现的-
Faktury
。什么是
NSFetchedResultsController
的委托,在代码中的什么位置设置它?NSFRC的委托是
Faktury
Faktury
是否创建了
NSFetchedResultsController
?您是否将Faktury设置为NSFRC启动时的代理?
controllerWillChangeContent:
是否每次都命中?它的代码是什么?我们可以做很多心理调试,但如果你能给我们一些帮助解决问题的东西,那会更有成效。需要更多代码!;)那么,
controllerWillChangeContent:
是每次命中还是崩溃导致它偶尔不被命中?崩溃期间,向
controllerWillChangeContent:
消息发送的对象是什么?我的所有值都不是零。但是如果我插入nil
abort()
则调用。不是nil,因为它们都有值,或者它们中的任何一个实际上说“不是nil”?如果它说“不是零”,那将是一个问题。此外,最好尝试在代码的不同区域保存managedObjectContext,以查看哪一行导致了崩溃。尝试并找到应用程序的运行位置,直到您准确地看到问题所在。考虑到你说这种情况不会一直发生,我觉得这可能没有太大帮助,但确实值得一试。这是一个拆分视图控制器应用程序吗?你使用的是表视图控制器吗?不,它是UIViewController中的UITableView。看,告诉过你!;)尽管这个解决方案还远远不够完美。如果KontrahentPicker是模态的,持有一个NSFetchedResultsController并且是它的委托,一旦它被解除,它应该与NSFRC实例一起被完全销毁。My dealloc将委托设置为nil,然后使用NSMOC释放NSFRC。感谢您的回答!你刚刚为我节省了一个漫长的调试之夜。
- (void)add:(id)sender {
    FakturaCreator *form = [[FakturaCreator alloc] init];
    form.hidesBottomBarWhenPushed = YES;
    form.delegate = self;
    form.managedObjectContext = self.managedObjectContext;
    [self.navigationController pushViewController:form animated:YES];
    [form release];
}
self.fetchedResultsController.delegate = nil;