1

我正在尝试实施斯坦福 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_BAD_ACCESS 调用,但数据库永远不会保存。我已经将保存插入到其他部分中,它在那里工作正常,只是在这个例程中没有。我没有在我的视图中发布任何托管对象,只是托管对象上下文(flickrContext,或者我在视图中调用它的任何内容)。

有任何想法吗?

4

3 回答 3

4

你确定这applicationWillTerminate:甚至被称为?

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

运行->后台->后台暂停->退出

转换到后台状态时您会收到一个applicationDidEnterBackground:电话,但当后台进程挂起或退出时没有进一步的通知。

因此,您确实需要applicationDidEnterBackground:为 iOS4 以及applicationWillTerminate:旧版本保存状态

于 2010-09-08T01:56:17.977 回答
0

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

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

于 2010-09-11T03:03:16.120 回答
0

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

(当你需要使用它时——

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

)

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

于 2010-09-08T01:45:58.180 回答