managedObjectModel为nil(无法使用nil模型创建NSPersistentStoreCoordinator)

我有这种特殊情况,在我的应用程序中工作完全正常一段时间,并在一段时间后不一致崩溃。 我在崩溃期间得到的错误是“无法使用nil模型创建NSPersistentStoreCoordinator”

我尝试调试我的应用程序,发现有时候managedObjectModel返回NULL 。 为了给火灾添加燃料,这种情况并不完全一致。 有一段时间, managedObjectModel 。 但是,突然它返回NULL

这是我用来创建托管对象模型的代码。

 - (NSManagedObjectModel *)managedObjectModel { if (managedObjectModel_ != nil) { return managedObjectModel_; } NSBundle *newBundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"dataBundle" withExtension:@"bundle"]]; NSString *modelPath = [newBundle pathForResource:@"DataHouse" ofType:@"momd"]; NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; NSLog(@"managedObjectModel_ %@", [managedObjectModel_ entities]); return managedObjectModel_; } 

如您所见,由于一些特殊要求,我放置了我的。 xcdataModeld文件位于单独的包中并从那里引用它。 我很震惊,需要一些帮助……谢谢

首先,确保永远不会将managedObjectModel_重置为nil 。 只需在源代码中搜索“ managedObjectModel_ = ”,唯一的结果应该是您发布的managedObjectModel代码。

其次,确保managedObjectModel_无法从外部访问,或者(如果您将managedObjectModel作为属性公开)readonly。

第三,确保管理Core Data堆栈的类中只有一个实例。 如果它是在主窗口nib中初始化的UIApplication委托,则不应以编程方式创建它。 如果是单身,请检查是否有一个单一的实例。

当你绝对确定一切正确时,是时候深入挖掘了。 您可以尝试在GDB中将watchpoint设置为managedObjectModel_

您的代码中可能发生的最糟糕的事情是一种memset / memmove操作,它们会覆盖您的Core Data堆栈管理器占用的内存。 但是这种错误太随机了,不能总是命中一个给定的内存地址,所以我不会指望它。