日志

时间:2016-10-05 13:59:27

标签: ios objective-c xcode nsuserdefaults

我在日志中收到一些错误消息

 [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];
}

6 个答案:

答案 0 :(得分:28)

很多人在Xcode 8上发现了这个问题。

&#34;听起来很疯狂尝试重新启动手机和主机,有时候Xcode可能会因为总结原因而卡住,只有重启有帮助。

使用Xcode 8.1 Beta进行构建,您将看到相同的警告,但您也将获得该值。 &#34;

参考:https://forums.developer.apple.com/thread/51348

答案 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];

在设置所有对象后调用一次同步。