managedObjectModel - ноль (невозможно создать NSPersistentStoreCoordinator с ноль-моделью)
У меня есть особый сценарий, в котором мое приложение работает отлично в течение некоторого времени и через некоторое время происходит сбой. Ошибка, которую я получаю во время аварии: "Не удается создать 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 в отдельном комплекте и ссылки на него оттуда. Я получил удар и нужна помощь.... Спасибо
1 ответ
Прежде всего, убедитесь, что вы никогда не сбрасываете managedObjectModel_
в nil
, Просто найдите ваш исходный код для "managedObjectModel_ =
", единственный результат должен быть в managedObjectModel
код вы разместили.
Во-вторых, убедитесь, что managedObjectModel_
либо недоступен извне, либо (если вы выставите managedObjectModel
как собственность) только для чтения.
В-третьих, убедитесь, что есть один и только один экземпляр класса, управляющий стеком основных данных. Если это UIApplication
инициализировать делегат в главном окне, вы не должны создавать его программно. Если это синглтон, проверьте, есть ли действительно один экземпляр этого.
Когда вы абсолютно уверены, что все правильно, пора копать глубже. Вы можете попробовать установить точку наблюдения в GDB на managedObjectModel_
,
Худшее, что может произойти в вашем коде, это своего рода memset
/memmove
операции, которые перезаписывают память, занятую вашим менеджером стека основных данных. Но такого рода ошибки слишком случайны, чтобы всегда попадать по заданному адресу памяти, поэтому я бы на них не рассчитывал.