如果用户退出应用程序并且它们是全局的,NSUserDefaults 会保留吗?
Will NSUserDefaults remain if user quits app and are they global?
我在我的 iOS 应用程序中使用 NSUserDefaults
来记录有关用户收据状态的一些特定信息。
我想确认:
- 如果用户退出应用程序,这些默认值会保留吗?
- 它们是全局的吗,例如,我目前正在使用以下行来获取或设置它们以及跨不同的方法。我只是想确定其中的数据仍然存在——所以如果我在 method1 中设置,然后在 method2 中设置,我使用同一行来获取,它将具有我在 method1 中设置的任何内容:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
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 秒似乎足以让刷新的数据一直到磁盘。
我在我的 iOS 应用程序中使用 NSUserDefaults
来记录有关用户收据状态的一些特定信息。
我想确认:
- 如果用户退出应用程序,这些默认值会保留吗?
- 它们是全局的吗,例如,我目前正在使用以下行来获取或设置它们以及跨不同的方法。我只是想确定其中的数据仍然存在——所以如果我在 method1 中设置,然后在 method2 中设置,我使用同一行来获取,它将具有我在 method1 中设置的任何内容:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
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 秒似乎足以让刷新的数据一直到磁盘。