managedObjectModel - ноль (невозможно создать NSPersistentStoreCoordinator с ноль-моделью) - PullRequest
2 голосов
/ 09 февраля 2012

У меня есть особый сценарий, в котором мое приложение работает отлично в течение некоторого времени, а через некоторое время происходит сбой. Ошибка, которую я получаю во время аварии: «Невозможно создать 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 Ответ

1 голос
/ 09 февраля 2012

Прежде всего, убедитесь, что вы никогда не сбросили managedObjectModel_ на nil. Просто найдите в исходном коде «managedObjectModel_ =», единственный результат должен быть в managedObjectModel коде, который вы отправили.

Во-вторых, убедитесь, что managedObjectModel_ либо недоступен извне, либо (если вы выставляете managedObjectModel как свойство) только для чтения.

В-третьих, убедитесь, что есть один и только один экземпляр класса, управляющий стеком основных данных. Если это делегат UIApplication, инициализированный в кончике главного окна, вам не следует создавать его программно. Если это синглтон, проверьте, действительно ли есть один его экземпляр.

Когда вы абсолютно уверены, что все правильно, пора копать глубже. Вы можете попробовать установить точку наблюдения в GDB на managedObjectModel_.

Худшее, что может произойти в вашем коде, это операции типа memset / memmove, которые перезаписывают память, занятую вашим менеджером стека базовых данных. Но такого рода ошибки слишком случайны, чтобы всегда попадать по заданному адресу памяти, поэтому я бы на них не рассчитывал.

...