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

adr*_*rin 3 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"];
}
Run Code Online (Sandbox Code Playgroud)

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


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

小智 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
Run Code Online (Sandbox Code Playgroud)

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

- (void)applicationWillTerminate:(UIApplication *)application {
  [NSKeyedArchiver archiveRootObject:yourRootObject toFile:someFilePath];
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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