2010-09-08 175 views
1

我试图从斯坦福CS193课程实施狗仔队2任务,我遇到了问题。我的一个呼叫保存数据库是当应用程序退出(我是从麦克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或我在视图中调用它的任何内容)。

任何想法?

+0

嗨,请在“未解决的错误”之后发布程序所说的内容。记录下来帮助你/我们发现问题!没有这些,我们无法猜测发生了什么。 – Yuji 2010-09-08 01:46:53

回答

4

你确定applicationWillTerminate:甚至被称为?

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

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

过渡到后台状态时,你会得到一个applicationDidEnterBackground:电话,但后台进程暂停或退出时不会再发出通知。

所以,你真的需要保存在applicationDidEnterBackground:为iOS4的状态,以及在applicationWillTerminate:旧版本

+0

如果用户双击打开任务管理器并杀死一个应用程序,它仍然会得到applicationWillTerminate,对吗?只要确保iOS 4的更改不会导致您描述的情况下丢失数据。 – 2010-09-08 02:06:16

+0

@Adam不,我相信你没有得到applicationWillTerminate当应用程序从任务管理器中死亡(只需通过在模拟器中测试证实)。 applicationDidEnterBackground实际上是您保存数据的唯一机会,因为您在退出之前可能无法再次运行。 – 2010-09-08 02:17:22

0

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

(当你需要使用它 -

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

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

+1

他的行“我不会释放我的视图中的任何托管对象,只是托管的对象上下文(flickrContext,或任何我在视图中调用它的内容)”。听起来也很奇怪。他说他发布了moc吗?那肯定不好。 – Yuji 2010-09-08 01:47:43

0

良好的通话。我真的解决了这个老式的(蛮力)方式。事实证明,applicationWillTerminate没有被调用,但它并不明显。创建我从Web上借用的数据库的例程明确地发布了一个NSArray,我很确定它是自动发布的。它基本上把程序变成了一个定时炸弹。尽管我仍然没有弄清楚它为什么会持续下去,只是在我试图退出时才表现出来。

我还在学习XCode和CocoaTouch。我知道NSZombieEnabled,但我还没有想出如何正确使用它。我仍然处于火腿猴阶段。不过谢谢你的提示。他们很有帮助。