我在iOS应用中使用NSUserDefaults
记录一些有关用户收据状态的特定信息。
我想确认:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
答案 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秒似乎足够长,以使刷新后的数据一直到磁盘。