2016-09-12 31 views
15

注:我看到的堆栈溢出许多其他职位约NSUserDefaults被重命名为UserDefaults斯威夫特或不工作的模拟器,直到重新启动。无论如何,这不是重复的。 SO所标注的许多问题都来自4年前。我的问题是从今年开始专门针对iOS 10的,因为它一直在旧版本中运行。我已经在我的问题中提到过,我的问题不是这些问题的重复,因为那些是模拟器错误,我的问题是设备客观的C错误。 请仔细阅读标记前重复的问题iOS的10 XCode的8 GM NSUserDefaults的引起间歇不行

我的问题是不同的,因为我可以在目标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]; 
    [email protected]"NSUserDefaults was NOT there, try running again"; 
} else { 
    NSLog(@"checkIfInitialized exists already"); 
    self.view.backgroundColor=[UIColor blueColor]; 
    [email protected]"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,如果是这种情况,那么这就是你应该防范的一般问题。值得注意的是,如果首选项文件在应用程序当前正在运行的 环境中加密(例如,首选项 设置为“NSFileProtectionComplete”并且应用程序在 背景中运行),则标准用户默认设置 将返回NULL。这对于标准前景应用程序而言不应该是一个问题,但它仍然需要注意。

这很可能是Xcode实际上是在这里引发问题。 Xcode极大地使应用程序启动环境变得复杂,其方式与 非常不同,比标准的应用程序启动。我的猜测是,这是 基本上是由Xcode的时机触发应用程序启动期间预期的 情况,但如果你想更正式的测试 尝试设置applicationDidFinishLoching 单个断点,并尽快继续在调试器当你击中它。我的猜测是 只是增加,中断的时间足以阻止从 发生的问题。有点。它只是iOS 10,因为iOS 9将不会打印该日志消息,但这是因为在iOS 10中添加了日志消息 。代码本身与iOS 9.3相似,因此我认为 的行为完全相同(至少在理论上)可能在 iOS 9中。

+0

@Hamish这不是一个重复无论如何。这个问题来自4年前。我的问题是从今年开始专门针对iOS 10的,因为它一直在旧版本中运行。 –

+1

可能重复[iOS 10,NSUserDefaults不起作用](http://stackoverflow.com/questions/37840288/ios-10-nsuserdefaults-does-not-work) – JAL

+0

@JAL我已经在我的问题中提到过,我的问题不是这些问题的重复,因为那些模拟器错误在迅速和我的问题是在设备客观C错误。请在标记为重复之前阅读问题 –

回答

8

是的,这绝对是一个可重现的错误。

  • 它发生在Xcode 8和iOS 10.
  • 的GM释放它是参照夫特所述链接的问题。
  • 它是而不是提到的模拟器测试版的链接问题。

该错误发生在设备和模拟器上。它是间歇性的:保存将工作六次,然后失败。与你不同,我没有得到“未能写入密钥”的信息。

在没有Xcode的情况下直接在设备上运行时也会发生该错误。这实际上是我发现它的方式。

你应该report a bug to Apple,特别是因为你有一个简短的程序,将重现它。我也会这样做。

一键区别:在我的情况下,失败是在的默认值。先前写入的值保留在NSUserDefaults中。有时一个密钥成功写入,另一个密钥不变。

+0

感谢您的更新!几分钟前,我刚与苹果公司记录了DTS,因为现在我知道我不是唯一面临问题的人。如果他们认为这应该是一个错误,那么这将是一个非常重要的错误,并导致应用程序中出现很多问题。 –

+1

我刚刚报告了一个bug 28287988并记录了一个DTS。将更新我找到的内容。 –

+0

错误28289469在这里。 – nugae

0

来自我自己的支持请求的类似非常智能的DTS响应。基本上,使用Xcode进行杀戮比设备上自然发生的任何事情都更加凶残(即使是双击Home-click-up-upwipe方法),并且由于Xcode暂停时突然崩溃,NSUserDefaults的延迟写入可能会失败,或者只有一半完成。

实际上,如果没有涉及Xcode,纯粹的应用程序设备测试显示,当应用程序终止时,一切都会正确写入NSUserDefaults。

我已经关闭了我自己的错误报告。

+0

仅供参考 - 它也发生在使用Xcode 8.2.1的macOS上。 –