gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:24:31 25 4
gpt4 key购买 nike

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

我现在的代码是这样的

- (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"];
}

但是加载状态总是 nil...所以我认为这不是最好的模式 :)


事实证明,NSUserDefaults 只支持 Property List 对象,如 NSArray、NSData 等...不支持自定义对象,除非你将其包装在 nsdata 中

最佳答案

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

如果您有一个包含单个根对象的简单对象模型,并且您往往需要一次将整个对象模型存储在内存中,那么您可能会发现 NSCoding 协议(protocol)(参见下面的链接)是一种保存状态的好方法。

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

任何你想要持久化的对象都应该实现这个协议(protocol)的两个方法:

 - (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

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

关于iphone - 如何在退出时轻松保持应用程序状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3742927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com