假设我的应用程序状态被提取到一个对象中(以便所有特定于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中,否则不会自定义对象
答案 0 :(得分:5)
有多种方法可以在应用程序退出之前存储应用程序的状态,并在应用程序再次启动时进行恢复。最好的方法实际上取决于您的应用程序。
如果您有一个带有单个根对象的简单对象模型,并且您倾向于一次需要内存中的整个对象模型,那么您可能会发现NSCoding协议(请参阅下面的链接)是一种保存状态的好方法。
您要保留的任何对象都应该实现此协议的两种方法:
- (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。
最后,虽然用户默认系统可用于存储和检索值,但最好用于简单的应用程序设置(或首选项)。它并不是真正用于保存整个应用程序的状态。
答案 1 :(得分:0)
状态是什么类型的对象?
我相信NSUserDefaults
只会保存NSData
,NSString
,NSDictionary
,NSDate
,NSArray
和NSNumber
。
过去,我已将状态保存到字典中并使用NSUserDefaults
存储它。您还可以归档您的状态并将其转换为NSData
并将其保存为NSUserDefaults
。