我有这种特殊情况,我的应用程序在一段时间内完美运行并且在一段时间后不一致地崩溃。我在崩溃期间遇到的错误是“无法使用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 文件放在单独的捆绑包中并从那里引用它。我很震惊,需要一些帮助....谢谢
答案 0 :(得分:1)
首先,请确保您永远不会将managedObjectModel_
重置为nil
。只需搜索" managedObjectModel_ =
"的源代码,唯一的结果应该是您发布的managedObjectModel
代码。
其次,请确保managedObjectModel_
无法从外部访问,或者(如果您将managedObjectModel
作为属性公开)只读取。
第三,确保管理核心数据堆栈的类中只有一个实例。如果它是在主窗口nib中初始化的UIApplication
委托,则您不应该以编程方式创建它。如果它是一个单身人士,请检查它是否真的是一个单一的实例。
当你绝对确定一切正确时,是时候深入挖掘了。您可以尝试在GDB中将观察点设置为managedObjectModel_
。
代码中可能发生的最糟糕的事情是一种memset
/ memmove
操作,这些操作恰好覆盖了Core Data堆栈管理器占用的内存。但是这种错误太随机了,不能总是命中一个给定的内存地址,所以我不会指望它。