如果用户退出应用程序,NSUserDefaults将保留吗?它们是否是全局的?

时间:2019-05-16 13:39:18

标签: ios nsuserdefaults

我在iOS应用中使用NSUserDefaults记录一些有关用户收据状态的特定信息。

我想确认:

  • 如果用户退出了该应用程序,这些默认值会保留吗?
  • 它们是全局的,例如,我当前正在使用以下行来获取或设置它们,并使用不同的方法。我只是想确定其中的数据是否持久-因此,如果我在method1中进行设置,则稍后在method2中,我使用同一行获取内容,它将具有我在method1中设置的内容: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

4 个答案:

答案 0 :(得分:4)

  

如果用户退出了该应用程序,这些默认值会保留吗?

是的,它们是持久的。

  

它们是全球性的吗?

就您的整个应用而言,是全球性的:是的。

从跨应用程序的角度讲是全球性的:否。它们在应用程序的沙箱中。

答案 1 :(得分:1)

来自NSUserDefaults文档(请参见 https://developer.apple.com/documentation/foundation/nsuserdefaults?language=objc

  

除了教育机构中的托管设备外,用户的默认值都存储在本地的单个设备上,并保留用于备份和还原。要在用户连接的设备上同步首选项和其他数据,请改用NSUbiquitousKeyValueStore。

所以对于第一个问题,答案是肯定的。

根据您的第二个问题,医生说:

  

在运行时,您可以使用NSUserDefaults对象从用户的默认数据库中读取您的应用使用的默认设置。 NSUserDefaults缓存信息,以避免每次需要默认值时都必须打开用户的默认数据库。设置默认值后,它会在您的流程中同步更改,并异步更改为永久存储和其他流程。

即使这样,它仍声明该类是线程安全的,因此您可以确定持久性结果(第二个答案)。

答案 2 :(得分:0)

此外还有@Nikolai Ruhe的答案。

  

如果我在method1中进行了设置,那么稍后的method2我使用同一行来获取,它将具有我在method1中进行设置的内容:NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];

UserDefaults类是线程安全的。

答案 3 :(得分:0)

还有两点。

synchronize的无用性在iOS版本中逐渐增长。它曾经是必不可少的。然后建议然后没有必要。我无法提供确切的时间表,但很大程度上取决于您希望应用在iOS上运行多久。

如果您尝试在Xcode中测试其中的某些内容,请当心。直到iOS 11(包括iOS 11)为止,synchronize不会一直写入磁盘,而只会将数据放入“延迟写入”队列。按下Xcode中的“停止”按钮(或按下“运行”并允许Xcode自动停止先前运行的应用程序)会突然关闭所有内容,比用户可以执行的操作突然关闭,并且懒惰的写操作不会被写出,而是会丢失。当您休息时,这令人困惑!!我对此提交了一份报告,并被苹果公司告知(正如Microfot所言)“这种行为是设计使然”。

但要清楚一点:只有在您尝试测试“保存并重新启动”方案时,第二点对于实际环境中的实际应用程序并不构成问题。等待5到10秒似乎足够长,以使刷新后的数据一直到磁盘。