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协议(见下面的链接)是一种保存状态的好方法.
您要保留的任何对象都应该实现此协议的两种方法:
- (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.
最后,虽然用户默认系统可用于存储和检索值,但最好用于简单的应用程序设置(或首选项).它并不是真正用于保存整个应用程序的状态.
| 归档时间: |
|
| 查看次数: |
4261 次 |
| 最近记录: |