База данных Core Data не сохраняет - PullRequest
1 голос
/ 08 сентября 2010

Я пытаюсь выполнить задание Paparazzi 2 из курса Stanford CS193 и столкнулся с проблемой.Мой единственный вызов для сохранения базы данных - когда приложение закрывается (я заимствую у версии Майка Постеля, чтобы проверить мой код):

- (void)applicationWillTerminate:(UIApplication *)application {
    if (flickrContext != nil) {
        if ([flickrContext hasChanges] == YES) {
            NSError *error = nil;
            BOOL isSaved = [flickrContext save:&error];
            NSLog(@"isSaved? %@", (isSaved ? @"YES" :@"NO") );

            // Replace this implementation with code to handle the error appropriately.
            if(isSaved == NO){
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
                abort();
            }
        } 
    }
}

К сожалению, это не похожеделать работу.Я получаю случайный вызов EXEC_BAD_ACCESS, который может быть связан с этим, но база данных никогда не сохраняет.Я вставил сохранение в другие части, и там все работает нормально, только не в этой процедуре.Я не освобождаю ни один из управляемых объектов в моих представлениях, только контекст управляемого объекта (flickrContext или как я его называю в представлении).

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 08 сентября 2010

Вы уверены, что applicationWillTerminate: даже вызывается?

При поддержке iOS4 и фоновых процессов обычный жизненный цикл приложения теперь составляет:

работает -> фон -> фон приостановлен -> выход

Вы получаете вызов applicationDidEnterBackground: при переходе в фоновое состояние, но больше не получаете уведомлений, когда фоновый процесс приостанавливается или завершается.

Итак, вам действительно нужно сохранить состояние в applicationDidEnterBackground: для iOS4, а также в applicationWillTerminate: для более старых версий

0 голосов
/ 11 сентября 2010

Хороший звонок. Я на самом деле решил это по старинке (грубой силой). Оказывается, applicationWillTerminate не вызывался, но это было неочевидно. Процедура создания базы данных, которую я позаимствовал из Интернета, была явным выпуском NSArray, который, я уверен, был автоматически выпущен. По сути, это превратило программу в бомбу замедленного действия. Хотя я до сих пор не понял, почему это продолжалось так долго, как это было, и просто не проявлялось, пока я не попытался выйти.

Я все еще изучаю XCode и CocoaTouch. Я знаю о NSZombieEnabled, но пока не понял, как правильно его использовать. Я все еще на сцене с обезьянами. Спасибо за советы, хотя. Они были полезны.

0 голосов
/ 08 сентября 2010

flickrContext - это ваш управляемый объектный текст?Держу пари, что когда вы нажмете этот метод, он будет ноль или иным образом.Вы говорите, что выпускаете его в виде - конечно, вы должны создать только один, принадлежащий делегату приложения, и выпустить его только в делегате приложения dealloc?

(И когда вам нужно использоватьэто -

NSManagedObjectContext* moc = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

)

Что касается вашего EXEC_BAD_ACCESS - что происходит с NSZombieEnabled = YES?Что говорит статический анализатор?

...