2010-09-18 154 views
3

假设我的应用程序状态被解压缩到一个对象中(以便所有特定于应用程序实例的信息都包含在一个对象中)并且该对象支持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中

回答

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

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

0

什么类型的对象是状态?

我相信NSUserDefaults只保存NSDataNSStringNSDictionaryNSDateNSArrayNSNumber

在过去,我已经将状态保存为字典并使用NSUserDefaults进行存储。您也可以将您的状态归档并将其转换为NSData并将其保存为NSUserDefaults

相关问题