0

我正在尝试将一些数据保存在一个名为 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];}

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

4

2 回答 2

2

两件事情:

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

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

我提到的这些“事件”中的每一个都是您可以通过应用程序委托消息订阅通知来响应的东西——使用适合您情况的任何一个。如果需要保存的数据由应用程序委托以外的对象(例如视图控制器)维护,则让该对象执行保存以响应通知可能更有意义。

有关更多详细信息,这里是 iOS 4+ 中应用程序生命周期事件的一个很好的概述


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

于 2012-04-09T16:48:48.900 回答
1

我认为您应该在“applicationWillEnterBackground”方法中编写这些代码,因为当应用程序在后台并且用户将其杀死时,您在 applicationWillTerminate 中的代码可能无法正常工作。

于 2012-04-09T16:34:49.563 回答