iOS 10,NSUserDefaults不起作用

19

我尝试向/读取值从[NSUserDefaults standardUserDefaults],但似乎不起作用。我的代码是:

[[NSUserDefaults standardUserDefaults] setObject:@"sampleString" forKey:@"sampleKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSString *defaultsValue = [[NSUserDefaults standardUserDefaults] objectForKey:@"sampleKey"];
return defaultsValue;

这段代码在 Xcode 8.0 beta 和 iPhone 6s (10.0) 模拟器上返回 nil。然而,在 Xcode 8.0 beta 和 iPhone 6s (9.1) 模拟器上返回 sampleString

我正在使用新系统测试我的应用程序。我做错了什么吗?还是有解决方法?或者只是一个“beta”问题?


这对我来说看起来不错。查看NSUserDefaults的文档,看看iOS 10有什么新东西。 - Gil Sand
1
在编程中,写入一个值后立即读回它有什么深刻(实用)的意义? - vadian
1
@vadian 这不是我的实际代码。我基本上在应用程序的第一次启动时编写,然后在第二次读取。示例代码只是在我意识到它不起作用后进行测试。 - antonio
3
不要执行[[NSUserDefaults standardUserDefaults] synchronize]。 - Helen Wood
你能试试使用 setValue forKey 吗? - Dharmbir Singh
9
有些人将这个问题标记为重复。它不是。另一个问题是关于Swift中IOS 10 API名称更改/编译时问题,而这个问题是关于运行时的Objective-C问题。 - Rob Bajorek
4个回答

26

我刚遇到了同样的问题。似乎在首次运行iOS8或9模拟器,然后再运行iOS10模拟器时,NSUserDefaults存在问题。 重新启动Mac解决了我的问题。


2
确认。关闭和重新打开模拟器没有起作用,但是重新启动解决了我的问题。 - Rob Bajorek
你也可以使用旧的模拟器作为临时解决方法(iOS 9.2 对我有效)。 - GK100
3
根据苹果公司发布的消息(https://developer.apple.com/library/prerelease/content/releasenotes/Miscellaneous/RN-Foundation-OSX10.12/index.html),同时运行多个iOS模拟器可能导致NSUserDefaults无法正常工作。先运行iOS 8或9模拟器再运行iOS 10模拟器会导致模拟器中的NSUserDefaults停止工作。可以通过重新启动主机Mac来解决此问题。 - iHS

6
这是 Xcode 8 Beta 1 自带的 iOS 模拟器中存在的问题,这个 bug 已经在 Beta 2 中修复了:

Xcode 8 beta 2 – IDE 中已解决

模拟器

  • iOS 10 模拟器中 NSUserDefaults 函数工作正常,无论之前是否启动过 iOS 8 或 iOS 9 模拟器。(25974372)

Xcode 8 Beta 2 发行说明

升级到 Xcode 8 Beta 2 可以避免每次重启主机 Mac 的麻烦。


3

更新:

如果启用了数据保护,当应用程序进入后台时,synchronize 可能也会失败。


我们在运行 iOS 10.1.1 的 真实设备 上遇到了这个问题。旧值可以读取,但新更改无法保存到磁盘上,synchronize 方法总是失败。

重新启动设备可以解决此问题。


谢谢!我希望这不是用户设备上的情况! - Patrick Bodet
谢谢,我在真实设备上遇到了这个问题。 - Ricardo
但是我已经禁用了数据保护。 - Ricardo
@Ricardo总是失败还是只是偶尔?这是可以重现的吗? - BB9z
@BB9z 是我的错 - Ricardo

1
我刚遇到了同样的问题。在首次运行iOS8或9模拟器,然后运行iOS10模拟器时,NSUserDefaults似乎存在问题。重新启动Mac解决了我的问题。 确认。关闭并重新打开模拟器无效,但重新启动解决了我的问题。
根据苹果公司(苹果链接) WWDC种子:运行多个iOS模拟器可能会导致NSUserDefaults无法工作。先运行iOS 8或9模拟器,然后运行iOS 10模拟器会导致模拟器中的NSUserDefaults停止工作。可以通过重新启动主机Mac来解决此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接