为什么NSUserDefaults不能保存我的值?

52

大家好,我正在尝试使用NSUserDefaults将一些默认值保存在数据库中。我已经成功地将这些值保存在了NSUserDefaults中(并在NSLog中检查过)。 现在,当应用程序重新启动时,我需要在应用程序委托中获取这些值。但是我在NSUserDefaults中没有得到任何值。以下是我在类中保存这些值到NSUserDefaults的代码:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

            [prefs setObject:appDel.dictProfile forKey:@"dict"];
            NSLog(@"%@",[prefs valueForKey:@"dict"]);

以下是我从App Delegate获取的代码:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

NSLog(@"%@",[prefs valueForKey:@"dict"]);

上面的代码总是返回 null。 有人可以帮忙吗?

4个回答

208

如果你通过按下模拟器或设备上的主屏幕按钮来终止应用程序,则会保存你的NSUserDefaults

如果你通过Xcode中的“停止”按钮(在模拟器或设备上)来终止应用程序,你的NSUserDefaults可能会被保存,但很可能不会。 NSUserDefaults会定期保留任何更改,如果在这些更改被保留之前终止进程,则它们将消失。你可以通过调用以下方法来强制保存:

[[NSUserDefaults standardUserDefaults] synchronize];



追加说明:

在iOS4中(此回答最初是针对公开版本为iOS3时编写的),当按下主屏幕按钮时,您的NSUserDefaults可能无法保存。 在applicationDidEnterBackground:中手动调用[[NSUserDefaults standardUserDefaults] synchronize]应该可以确保正确保存您的NSUserDefaults(我认为这实际上应该是一种内置行为)。


1
iOS 8(iPad mini),我遇到了这个确切的问题,而且在appWillTerminateappDidEnterBackground中使用synchronize也没有帮助。天啊!!! - Olie
1
根据上面在苹果源代码文件NSUserDefaults.h中的注释: "-synchronize已过时。" - ma11hew28
值得一提的是,NSUserDefaults当前(2020年)的文档说明:-synchronize: 等待任何挂起的异步更新到默认数据库并返回;此方法是不必要的,不应该使用。 - Tad
我相信我遇到了同样的情况(在Xcode中使用command-period无法保存用户偏好设置),现在是2023年,我正在使用iOS16。 - esilver

10

这段代码对我来说可以正常工作。

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

if (standardUserDefaults) {
    [standardUserDefaults setObject:myString forKey:@"Prefs"];
    [standardUserDefaults synchronize];
}

8
这个回答并没有为讨论增添任何内容;上面已经提供了代码片段。 - Freney

2

您没有说明您是在设备上运行还是在模拟器上运行,但是如果您在模拟器中重新启动应用程序,并且从Xcode启动,则所有首选项将在启动之间重置。只有在从模拟器本身重新启动时,首选项才会被保留。


2
我不相信这是正确的。(可能是使用旧版本的SDK。) - Brad The App Guy
2
我同意Brad的观点。模拟器在从Xcode重新启动时会保留首选项值。只有当我们从模拟器中删除应用程序时,它才会丢失首选项。 - pankaj
3
当前版本的模拟器(iOS 4)保留了偏好设置,因此我的答案不再适用。原来写作时,iOS 3 是当前版本。 - Claus Broch

1
在我的情况下,我正在保存和检索一个字符串。当我在保存后同步,然后在另一个线程中检索时,它无法正常工作。问题是通过在保存之后和检索之前进行同步来解决的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接