我在日志中收到一些错误消息
[User Defaults] Failed to write value for key GameId in CFPrefsPlistSource<0x1740faf00> (Domain: xxx.xxxxxx, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null)): Path not accessible, switching to read-only
[User Defaults] attempt to set <private> for key in <private> in read-only (due to a previous failed write) preferences domain CFPrefsPlistSource<0x1740faf00> (Domain: xxx.xxxxxx, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null))
导致这种情况的原因是什么?
这就是我使用NSUserDefaults
的方式:
- (NSString *)gameId
{
if (_gameId)
return _gameId;
_gameId = [[NSUserDefaults standardUserDefaults] objectForKey:@"GameId"];
return _gameId;
}
- (void)setGameId:(NSString *)aGameId
{
_gameId = aGameId;
[[NSUserDefaults standardUserDefaults] setObject:_gameId forKey:@"GameId"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
答案 0 :(得分:28)
很多人在Xcode 8上发现了这个问题。
&#34;听起来很疯狂尝试重新启动手机和主机,有时候Xcode可能会因为总结原因而卡住,只有重启有帮助。
使用Xcode 8.1 Beta进行构建,您将看到相同的警告,但您也将获得该值。 &#34;
答案 1 :(得分:2)
我遇到了类似的错误:
[User Defaults] attempt to set <private> for key in <private> in read-only (due to a previous failed write) preferences domain CFPrefsPlistSource<0x1700f5f80>
但只有当我插入Xcode时才会发生。
设备重启修复此问题。
答案 2 :(得分:1)
如果您在尝试使用userDefault将数据保存到扩展APP时遇到此问题,可能您已编写此代码:[[NSUserDefaults standardUserDefaults ] initWithSuiteName:@&#34; group.xxx .com&#34;];,此代码重置默认userDefault。实际上,正确的代码是:[[NSUserDefaults alloc ] initWithSuiteName:@&#34; group.xxx.com&#34;]; http://www.jianshu.com/p/e782104c3bc3
答案 3 :(得分:1)
我遇到了同样的错误。我的错误是因为我多次调用同步。
只需在所有错误消息消失后调用[userDefaults synchronize]。
答案 4 :(得分:0)
我刚刚删除了应用并通过Xcode再次安装。使用XCode 8.2.1。
答案 5 :(得分:0)
我想分享我对此问题的解决方案。对于我的情况,错误是合法的错误,我的数据没有正确保存。事实证明,错误是由NSUserDefaults&#34;数据保存&#34;在一个循环中。
通过&#34;数据保存&#34;我是说这个(伪代码):
loop{
[defaults setObject:@"Data" forKey:@"Key"];
[defaults synchronize];
}
因此,代码会非常快速地执行多次并导致问题。 我想&#34;同步&#34;无法处理并发呼叫。
需要做的是:
loop{
[defaults setObject:@"Data" forKey:@"Key"];
}
[defaults synchronize];
在设置所有对象后调用一次同步。