注:我看到的堆栈溢出许多其他职位约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中。
@Hamish这不是一个重复无论如何。这个问题来自4年前。我的问题是从今年开始专门针对iOS 10的,因为它一直在旧版本中运行。 –
可能重复[iOS 10,NSUserDefaults不起作用](http://stackoverflow.com/questions/37840288/ios-10-nsuserdefaults-does-not-work) – JAL
@JAL我已经在我的问题中提到过,我的问题不是这些问题的重复,因为那些模拟器错误在迅速和我的问题是在设备客观C错误。请在标记为重复之前阅读问题 –