【问题标题】:iPhone setting NSUserDefaults to nil when app is closed or in background当应用程序关闭或在后台时,iPhone 将 NSUserDefaults 设置为 nil
【发布时间】:2011-04-08 06:09:33
【问题描述】:

每当应用程序关闭或在后台运行一段时间(例如 5 分钟)时,我想消除保存到 NSUserDefaults 的所有字段中的所有变量。

我尝试向 applicationDidFinishLaunching 的应用程序委托添加一行,如下所示:

if (UIApplicationStateBackground == TRUE) {
    NSUserDefaults *profiles = [NSUserDefaults standardUserDefaults];

    [profiles setObject:nil forKey:@"name1"];
    [profiles synchronize];
}

我也只将这部分添加到 applicationWillTerminate:

NSUserDefaults *profiles = [NSUserDefaults standardUserDefaults];

    [profiles setObject:nil forKey:@"name1"];
    [profiles synchronize];

这些似乎都不起作用,我不知道如何设置条件“如果超过 5 分钟的应用程序处于后台,请删除 NSUserDefaults 变量” - 有什么帮助吗?

【问题讨论】:

  • applicationDidFinishLaunching 在启动时被调用,它永远不会在后台启动 AFAIK。
  • 正确。然而,苹果在其关于 applicationDidFinishLaunchingWithOptions 的文档中说:“注意:强烈建议您使用此方法来初始化您的应用程序,而不是 applicationDidFinishLaunching: 方法。”

标签: ios application-state


【解决方案1】:

我建议删除对象而不是将其设置为 nil。

- (void)removeObjectForKey:(NSString *)defaultName;

NSUserDefaults 的正常行为是在没有与查询匹配的键时返回 nil,所以我认为最好遵循相同的规则,不要为某个键存储 nil。

希望对你有帮助。

【讨论】:

  • 当我尝试把 [profiles removeObjectForKey:@"name1"];我收到一条错误消息,说 NSUserDefaults 可能无法响应 removeObjectForKey。我不明白,因为 removeObjectForKey 的定义在 NSUserDefaults 文档中。
  • 奇怪...我无法确定该错误的原因。尝试清理您的项目,当然可以,但是,您确定配置文件是 NSUserDefaults 实例吗?
  • 在我上面的代码中,配置文件被创建为一个实例。我清理并重建,错误实际上说“NSUserDefaults 可能没有响应......” - 但如果你查看文档,removeObjectForKey: 在 NSUserDefaults 文档中 - 太奇怪了
【解决方案2】:

我将执行以下操作:在 UIApplication 的委托调用 - (void)applicationWillResignActive:(UIApplication *)application 中,我将在应用程序进入后台时保存时间戳。在这种情况下,您不必检查应用程序是否进入后台,或者它是否只是被例如中断。一条短信,但用户点击取消并继续使用您的应用程序。

当应用程序再次启动时,在 UIApplication - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 的另一个委托方法中执行代码以确定您处于非活动状态的时间,并根据持续时间清除 UserDefaults。

有关应用程序变为非活动状态和重新启动的更多信息,请查看 Apple 文档http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/CoreApplication/CoreApplication.html#//apple_ref/doc/uid/TP40007072-CH3-SW10的此文档

【讨论】:

    【解决方案3】:

    也许你应该使用 applicationDidEnterBackground:。查看this苹果文档页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多