Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在退出时轻松保持应用程序状态_Iphone_Cocoa Touch_Ios - Fatal编程技术网

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

Iphone 如何在退出时轻松保持应用程序状态,iphone,cocoa-touch,ios,Iphone,Cocoa Touch,Ios,假设我的应用程序状态被提取到一个对象中(以便特定于应用程序实例的所有信息都包含在一个对象中),并且该对象支持nscoding协议。如何在退出/启动应用程序时轻松保存和加载它 我当前的代码如下所示 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSUserDefaults *defaults = [NSUs

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

状态是什么类型的对象

我相信
nsserdefaults
只会保存
NSData
NSString
NSDictionary
NSDate
NSArray
NSNumber


过去,我将状态保存到字典中,并使用
NSUserDefaults
存储它。您还可以归档您的状态并将其转换为
NSData
,然后使用
nsserdefaults

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

如果您有一个简单的对象模型,其中只有一个根对象,并且您往往需要将整个对象模型同时存储在内存中,那么您可能会发现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];
}

可选地,如果应用程序的对象模型稍微复杂一些,则可以考虑使用核心数据。

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