如何在退出时轻松保持应用程序状态

时间:2010-09-18 18:27:56

标签: iphone cocoa-touch ios

假设我的应用程序状态被提取到一个对象中(以便所有特定于app实例的信息都包含在一个对象中),并且该对象支持nscoding协议。如何轻松地保留它并在我的应用程序的退出/启动时加载它?

我目前的代码如下所示

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    State* state = (State*)[defaults objectForKey:@"State"];
    if(state!=nil)
    {
    viewController.state = state;
    }
}

- (void)applicationWillTerminate:(UIApplication *)application {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:self.viewController.state forKey:@"State"];
}

但是加载状态总是为零......所以我认为它不是那里最好的模式:)


事实证明,NSUserDefaults仅支持属性列表对象,如NSArray,NSData等...除非您将其包装在nsdata中,否则不会自定义对象

2 个答案:

答案 0 :(得分:5)

有多种方法可以在应用程序退出之前存储应用程序的状态,并在应用程序再次启动时进行恢复。最好的方法实际上取决于您的应用程序。

如果您有一个带有单个根对象的简单对象模型,并且您倾向于一次需要内存中的整个对象模型,那么您可能会发现NSCoding协议(请参阅下面的链接)是一种保存状态的好方法。

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html

您要保留的任何对象都应该实现此协议的两种方法:

 - (void)encodeWithCoder:(NSCoder *)aCoder // to serialise the object
 - (id)initWithCoder:(NSCoder *)aCoder // to restore an object

一旦您在要保留的任何对象中实现了这些方法,就可以使用以下内容序列化对象图:

- (void)applicationWillTerminate:(UIApplication *)application {
  [NSKeyedArchiver archiveRootObject:yourRootObject toFile:someFilePath];
}

如果要还原已存档的对象:

- (BOOL)application:(UIApplication *)application
     didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
  id yourRootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:someFilePath];
}

或者,如果您的应用程序的对象模型稍微复杂一些,您可以考虑使用Core Data。

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html

最后,虽然用户默认系统可用于存储和检索值,但最好用于简单的应用程序设置(或首选项)。它并不是真正用于保存整个应用程序的状态。

答案 1 :(得分:0)

状态是什么类型的对象?

我相信NSUserDefaults只会保存NSDataNSStringNSDictionaryNSDateNSArrayNSNumber

过去,我已将状态保存到字典中并使用NSUserDefaults存储它。您还可以归档您的状态并将其转换为NSData并将其保存为NSUserDefaults