【发布时间】:2016-09-12 19:36:31
【问题描述】:
注意:我在 Stack Overflow 上看到过很多其他帖子,关于 NSUserDefaults 在 Swift 中被重命名为 UserDefaults 或在重新启动之前无法在模拟器上工作。无论如何,这不是重复的。 SO 所针对的许多问题都来自 4 年前。我的问题是从今年开始针对 iOS 10 的,因为这在旧版本中一直有效。我已经在我的问题中提到我的问题不是这些问题的重复,因为这些问题是 swift 中的模拟器错误,而我的问题是设备目标 C 错误。 请在标记为重复之前阅读问题
我的问题不同,因为我能够在目标 C 和物理设备本身上重现此问题。
我为此测试从头开始创建了一个全新的项目。我将此代码放在视图控制器的viewDidLoad 中:
if (![[NSUserDefaults standardUserDefaults] valueForKey:@"checkIfInitialized"]){
NSLog(@"setting checkIfInitialized as not exist");
[[NSUserDefaults standardUserDefaults] setValue:@"test" forKey:@"checkIfInitialized"];
[[NSUserDefaults standardUserDefaults] synchronize];
self.view.backgroundColor=[UIColor redColor];
self.mylabel.text=@"NSUserDefaults was NOT there, try running again";
} else {
NSLog(@"checkIfInitialized exists already");
self.view.backgroundColor=[UIColor blueColor];
self.mylabel.text=@"NSUserDefaults was already there this time, try running again";
}
现在,如果我运行该应用程序大约 10 次,它会找到 checkIfInitialized 的几次,有时却找不到。没有确切的失败次数,因为它可能工作 3 次,然后失败 2 次,然后工作 4 次,失败一次,依此类推。
现在我注意到(虽然不是 100% 肯定),这个问题似乎只在我通过 Xcode 测试连接时发生。如果我通过在没有 Xcode 的设备上单击应用程序图标来启动应用程序来运行,那么它似乎可以正常工作,但我不能 100% 确定。
我注意到这个错误有时会发生:
[User Defaults] Failed to write value for key checkIfInitialized in CFPrefsPlistSource<0x1700f7200> (Domain: com.xxxx.appname, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null)): Path not accessible, switching to read-only
如果你想测试一下,我的 Dropbox 上有这个非常简单的项目。 我建议测试大约 10-15 次以重现此问题。
https://www.dropbox.com/s/j7vbgl6e15s57ix/nsuserdefaultbug.zip?dl=0
这在 iOS 9 上完全可以正常工作,因此肯定与 iOS 10 有关。
编辑 记录的错误:28287988
来自苹果 DTS 团队的回应:
首先,您应该首先确定是standardUserDefaults 还是 valueForKey 失败。我的猜测是“standardUserDefaults”是 返回 NULL,如果是这样,那你就是 一般应提防。值得注意的是,standardUserDefaults 如果首选项文件在 应用程序当前运行的环境(例如,首选项 设置为“NSFileProtectionComplete”并且应用程序正在运行 背景)。这不应该是标准前台的问题 应用程序,但无论如何都需要注意。
Xcode 很可能实际上在这里引发了问题。 Xcode 极大地复杂化了应用程序的启动环境 与标准应用程序启动非常不同。我的猜测是,这是 基本上是由 Xcode 的时序触发的 应用程序启动期间的情况,但如果您想要更正式的测试 尝试在 applicationDidFinishLaunching 中设置单个断点 并在您点击它后立即继续调试器。我的猜测是 只是添加它会破坏足够的时间以阻止问题 正在发生。有点。 iOS 10 只是在 iOS 9 将 从不打印该日志消息,但那是因为日志消息是 在 iOS 10 中添加。代码本身与 iOS 9.3 非常相似,我 怀疑完全相同的行为(至少在理论上)可能在 iOS 9。
【问题讨论】:
-
问题重复。仅仅因为链接问题的答案对您没有帮助并不意味着您的问题以前没有被问过。我看到您已经编辑了您的问题,以说明您为什么认为这不是骗局。希望有人能来解决您的问题。
-
您显然没有阅读链接的问题,因为它与 Swift 无关。
-
绝对不是其他问题的重复,这些问题涉及 Swift 语言更改或 iOS 模拟器之间的不兼容。这可以在设备和模拟器中重现,并且确实是间歇性的。
-
感谢@PranoyC,这很有用
标签: ios objective-c xcode nsuserdefaults ios10