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

Will NSUserDefaults remain if user quits app and are they global?

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

我想确认:

If the user quits the app, will those defaults remain?

是的,他们很执着。

Are they global?

您的整个应用程序的全球意义:是的。

跨应用程序意义上的全局:不。它们在应用程序的沙箱中。

另外还有@Nikolai Ruhe 的回答。

if I set in method1 then later method2 I use the same line to get, it will have whatever I set in method1: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

UserDefaults class 是 thread-safe。

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

With the exception of managed devices in educational institutions, a user’s defaults are stored locally on a single device, and persisted for backup and restore. To synchronize preferences and other data across a user’s connected devices, use NSUbiquitousKeyValueStore instead.

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

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

At runtime, you use NSUserDefaults objects to read the defaults that your app uses from a user’s defaults database. NSUserDefaults caches the information to avoid having to open the user’s defaults database each time you need a default value. When you set a default value, it’s changed synchronously within your process, and asynchronously to persistent storage and other processes.

即使如此,它也声明 class 是线程安全的,因此您可以确定持久结果(对于您的第二个答案)。

还有两点。

synchronize的无用性在iOS的版本中逐渐长大。它曾经是必不可少的;那么可取的;那么不必要。我无法为您提供确切的时间表,但很大程度上取决于您希望您的应用程序在 iOS 之前运行多长时间。

如果您尝试在 Xcode 中测试其中一些内容,请当心。直至 iOS 11,synchronize 不会一直写入磁盘,而只会将数据放入“惰性写入”队列中。按 Xcode 中的停止按钮(或按 运行 并允许 Xcode 自动停止前一个 运行 应用程序)会突然关闭所有内容,比用户可以做的任何事情都要突然,而懒写的不是写出来,而是丢了。这在你休息的时候很混乱!!我就此提交了一份报告,Apple 告诉我(正如 Microfot 所说)“这种行为是设计使然”。

但要明确一点:第二点不会对真实环境中的真实应用程序造成问题,只有当您尝试测试“保存并重新启动”场景时才会出现问题。等待 5-10 秒似乎足以让刷新的数据一直到磁盘。