【问题标题】:NSUserDefaults errors in logs日志中的 NSUserDefaults 错误
【发布时间】:2017-02-14 00:30:22
【问题描述】:

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

[User Defaults] 无法在 CFPrefsPlistSource 中写入键 GameId 的值(域:xxx.xxxxxx,用户:kCFPreferencesCurrentUser,ByHost:否,容器:(null)):路径不可访问,切换到只读

[User Defaults] 尝试在只读(由于先前的写入失败)首选项域 CFPrefsPlistSource (域:xxx.xxxxxx,用户:kCFPreferencesCurrentUser,ByHost:否,容器:(空))

这是什么原因造成的?

这就是我使用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];
}

【问题讨论】:

  • 您使用的Xcode版本和iOS版本是什么?
  • @Tushar,Xcode 8,iOS 10

标签: ios objective-c xcode nsuserdefaults


【解决方案1】:

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

“尽管尝试重启手机和主机听起来很疯狂,但有时 Xcode 会因为总和原因而卡住,只有重启有帮助。

使用 Xcode 8.1 Beta 构建,您将看到相同的警告,但您也会得到值。 "

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

【讨论】:

  • 天哪!看起来这有帮助
  • 酷。很高兴它有帮助:)
  • @EricAya,是的,很难想到这样奇怪的解决方案,很高兴看到这篇文章很有用
【解决方案2】:

如果您在尝试使用 userDefault 将数据保存到扩展 APP 时遇到此问题,可能是您编写了以下代码:[[NSUserDefaults standardUserDefaults] initWithSuiteName:@"group.xxx.com" ];,此代码重置默认用户默认值。实际上,正确的代码是: [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.com"]; http://www.jianshu.com/p/e782104c3bc3

【讨论】:

  • Xcode8 是 Swift3 加载的,所以听起来像 "UserDefaults.standard.set(latitude, forKey: "lat")"
【解决方案3】:

我遇到了类似的错误:

[User Defaults] attempt to set <private> for key in <private> in read-only (due to a previous failed write) preferences domain CFPrefsPlistSource<0x1700f5f80>

但它只发生在我插入 Xcode 时。

设备重启解决了这个问题。

【讨论】:

    【解决方案4】:

    我刚刚遇到了同样的错误。我的错误是因为我多次调用同步。

    在所有错误消息消失后​​调用 [userDefaults synchronize]。

    【讨论】:

      【解决方案5】:

      我刚刚删除了该应用程序并通过 Xcode 再次安装。使用 XCode 8.2.1。

      【讨论】:

        【解决方案6】:

        我想分享我对这个问题的解决方案。就我而言,该错误是合法错误,并且我的数据未正确保存。事实证明,该错误是由循环中的 NSUserDefaults “数据保存”引起的。

        我所说的“数据保存”是指这个(伪代码):

        loop{
            [defaults setObject:@"Data" forKey:@"Key"];
            [defaults synchronize];
        }
        

        所以代码会非常快地执行多次并导致问题。 我猜“同步”不能处理并发调用。

        需要做的是:

        loop{
            [defaults setObject:@"Data" forKey:@"Key"];
        }
        [defaults synchronize];
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-26
          • 1970-01-01
          相关资源
          最近更新 更多