核心数据数据库不保存

时间:2010-09-08 01:31:52

标签: iphone objective-c core-data exc-bad-access cs193p

我正在尝试从斯坦福CS193课程实施Paparazzi 2任务,我遇到了一个问题。我的一个保存数据库的电话是当应用程序退出时(我从Mike Postel的version大量借用来检查我的代码):

- (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 个答案:

答案 0 :(得分:4)

您确定applicationWillTerminate:甚至被调用了吗?

借助iOS4和后台进程支持,通常的应用程序生命周期现在是:

正在运行 - >背景 - >背景暂停 - >出口

转换到后台状态时会收到applicationDidEnterBackground:来电,但后台进程暂停或退出时不会再发出通知。

因此,您确实需要在{4}中为iOS4保存状态,在applicationDidEnterBackground:中为旧版本保存状态

答案 1 :(得分:0)

flickrContext是你的managedObjectContext吗?我打赌当你使用这种方法时,它是零或以其他方式冲洗。你说你是在一个视图中发布它 - 当然你应该创建一个,让它由应用程序委托拥有,并只在app delegate的dealloc中发布它?

(当你需要使用它时 -

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

关于你的EXEC_BAD_ACCESS - NSZombieEnabled = YES会发生什么?静态分析仪说什么?

答案 2 :(得分:0)

好的电话。我实际上用老式的(蛮力)方式解决了这个问题。事实证明,applicationWillTerminate没有被调用,但它并不明显。创建我从网上借来的数据库的例程明确地发布了一个我非常确定是自动释放的NSArray。它基本上把程序变成了定时炸弹。虽然我还没弄清楚为什么它会持续多久但只是在我试图退出之前就没有显现出来。

我还在学习XCode和CocoaTouch。我知道NSZombieEnabled,但我还没弄清楚如何正确使用它。我还在火腿蹒跚的猴子阶段。谢谢你的提示。他们很有帮助。