如何在appDelegate.m中实现applicationWillTerminate

时间:2012-04-09 16:11:30

标签: iphone object delegates persistence nscoding

我正在尝试将一些数据保存在名为MyPos.h的类中,该类使用NSCoding方法:

  • (void)encodeWithCoder:(NSCoder *)aCoder
  • (id)initWithCoder:(NSCoder *)aDecoder

这两种方法已在MyPos.m文件中实现。

现在我希望应用程序在数据终止时保存数据并在数据完成启动时加载数据。我想在AppDelegate.m文件中实现to方法,但我无法理解如何保存包含数据的MyPos类的实例。

这是AppDelegate.m文件中的两个方法之一...到目前为止:

- (void)applicationWillTerminate:(UIApplication *)application {


NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

[archiver encodeObject: **HELP_HERE!** forKey:@"myPos"];
[archiver finishEncoding];

[data writeToFile:[self dataFilePath] atomically:YES];}

我该如何解决这个问题? 非常感谢。

2 个答案:

答案 0 :(得分:2)

两件事:

  1. 但对于**HELP_HERE!**,您的保存方法看起来不错。将该占位符替换为对包含数据的MyPos实例的引用。您如何引用该实例取决于您在应用程序委托中引用的方式。是财产还是伊娃?用那个。它是否属于程序中的其他对象(例如,视图控制器)?见下文。

  2. 请注意,在大多数情况下*在iOS 4+上,您的应用程序永远不会看到 willTerminate 事件 - 您会看到 willResignActive didEnterBackground ,但是当操作系统因为需要更多内存来终止你的应用程序时,你的应用程序已经被暂停,所以你没有机会对这个事件做出反应。您可能希望保存以响应 didEnterBackground 事件。 (尽管您可能会在数据更改后立即考虑保存。)

  3. 我提到的每个“事件”都可以回复via an app delegate messageby subscribing to a notification - 使用适合您情况的任何一项。如果需要保存的数据由应用程序委托之外的对象(例如,视图控制器)维护,则让该对象执行保存以响应通知可能更有意义。

    有关详细信息,请参阅iOS 4 +中的here's a good overview应用程序生命周期事件。


    (*)请注意,如果a)您正在使用其中一种受支持的后台执行模式(如播放音频或VoIP服务),您仍然可以获得 willTerminate ,b)您的应用程序已编译为4.0之前的SDK,或c)您已在Info.plist中将UIApplicationExitsOnSuspend密钥设置为YES。但是,最后一个选项意味着您放弃暂停/恢复功能的好处。

答案 1 :(得分:1)

我认为您应该在“applicationWillEnterBackground”方法中编写这些代码,因为当后台应用程序和用户终止它时,您的applicationWillTerminate中的代码可能无效。