Iphone 核心数据数据库不保存

Iphone 核心数据数据库不保存,iphone,objective-c,core-data,exc-bad-access,cs193p,Iphone,Objective C,Core Data,Exc Bad Access,Cs193p,我正在尝试执行斯坦福CS193课程中的狗仔队2作业,我遇到了一个问题。我保存数据库的一个电话是当应用程序退出时,我从Mike Postel那里大量借用来检查我的代码: - (void)applicationWillTerminate:(UIApplication *)application { if (flickrContext != nil) { if ([flickrContext hasChanges] == YES) { NSError *

我正在尝试执行斯坦福CS193课程中的狗仔队2作业,我遇到了一个问题。我保存数据库的一个电话是当应用程序退出时,我从Mike Postel那里大量借用来检查我的代码:

- (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\u BAD\u访问调用,可能与此有关,但数据库从未保存。我已经将保存插入到其他片段中,它在那里工作得很好,只是不在这个例程中。我不会在视图中释放任何托管对象,只会释放托管对象上下文flickrContext,或者在视图中调用它的任何内容


有什么想法吗?

flickrContext是你的managedObjectContext吗?我打赌当你用这个方法的时候,它是零或者以其他方式被冲洗掉。你说你是在一个视图中发布它-当然你应该只创建一个,由应用程序代理拥有,并且只在应用程序代理的dealloc中发布它

当你需要使用它的时候-

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


关于EXEC\u BAD\u访问-NSZombieEnabled=YES会发生什么?静态分析器说什么?

flickrContext是您的managedObjectContext?我打赌当你用这个方法的时候,它是零或者以其他方式被冲洗掉。你说你是在一个视图中发布它-当然你应该只创建一个,由应用程序代理拥有,并且只在应用程序代理的dealloc中发布它

当你需要使用它的时候-

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

关于EXEC\u BAD\u访问-NSZombieEnabled=YES会发生什么?静态分析器怎么说?

您确定应用程序将终止:甚至正在被调用吗

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

运行->后台->后台挂起->退出

当转换到后台状态时,您会得到一个applicationIdentinterBackground:调用,但当后台进程挂起或退出时,不会得到进一步的通知

因此,您确实需要将状态保存在ApplicationIdentinterBackground:中(对于iOS4)以及applicationWillTerminate:中(对于较旧版本)

是否确实调用了applicationWillTerminate:

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

运行->后台->后台挂起->退出

当转换到后台状态时,您会得到一个applicationIdentinterBackground:调用,但当后台进程挂起或退出时,不会得到进一步的通知


因此,您确实需要将状态保存在ApplicationIdentinterBackground:for iOS4中,以及applicationWillTerminate:for older版本中。我用老式的蛮力方法解决了这个问题。结果是applicationWillTerminate没有被调用,但这并不明显。我从网上借来的创建数据库的例程是显式地发布一个NSArray,我很确定它是自动删除的。它实质上把这个计划变成了一颗定时炸弹。虽然我还没有弄明白为什么它会持续这么久,直到我试图退出才显现出来


我还在学习XCode和CoCoTouch。我知道NSZombieEnabled,但我还没有弄清楚如何正确使用它。我还处在笨手笨脚的猴子阶段。不过,谢谢你的提示。他们很有帮助。

打得好。我用老式的蛮力方法解决了这个问题。结果是applicationWillTerminate没有被调用,但这并不明显。我从网上借来的创建数据库的例程是显式地发布一个NSArray,我很确定它是自动删除的。它实质上把这个计划变成了一颗定时炸弹。虽然我还没有弄明白为什么它会持续这么久,直到我试图退出才显现出来


我还在学习XCode和CoCoTouch。我知道NSZombieEnabled,但我还没有弄清楚如何正确使用它。我还处在笨手笨脚的猴子阶段。不过,谢谢你的提示。他们很有帮助。

您好,请在未解决的错误后发布程序所说的内容。这将被记录下来,以帮助您/我们识别问题!如果没有这些,我们就猜不出发生了什么。嗨,请在未解决的错误后发布程序所说的内容。这将被记录下来,以帮助您/我们识别问题!没有这一点,我们就猜不出发生了什么。他的台词我不会在我的视图中释放任何托管对象,只是托管对象上下文flickrContext,或者我在视图中调用的任何东西。听起来也很奇怪。他说他发布了moc吗?这肯定很糟糕。他的台词是:我不会在视图中释放任何托管对象,只会释放托管对象上下文flickrContext,或者我在视图中调用的任何东西。听起来也很奇怪。他说他发布了moc吗?这肯定很糟糕。如果用户双击打开任务管理器并杀死一个应用程序,它仍然会得到应用程序将终止,对吗?只是确保这是iOS 4 c
在您描述的情况下,hange不会导致数据丢失。@Adam不,我相信您不会得到应用程序。当任务管理器刚刚通过在模拟器中测试确认应用程序被终止时,应用程序将终止。ApplicationIdentinterBackground实际上是您保存数据的唯一机会,因为在退出之前您可能无法再次运行。如果用户双击打开任务管理器并杀死应用程序,它仍然会得到applicationWillTerminate,对吗?只是确保在您描述的情况下,iOS 4的更改不会导致数据丢失。@Adam不,我相信您不会得到应用程序将在任务管理器中终止应用程序时终止。通过在模拟器中进行测试,刚刚确认了这一点。ApplicationIdentinterBackground实际上是您保存数据的唯一机会,因为您可能无法在退出之前再次运行。