日志中的 NSUserDefaults 错误

Posted

技术标签:

【中文标题】日志中的 NSUserDefaults 错误【英文标题】:NSUserDefaults errors in logs 【发布时间】: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 【参考方案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];

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

【讨论】:

以上是关于日志中的 NSUserDefaults 错误的主要内容,如果未能解决你的问题,请参考以下文章

iOS 10,NSUserDefaults 不起作用

如何从命令行获取 NSUserDefaults

在 iOS App 和 Todays Extension 之间共享数据

在 NSUserDefaults 中存储 NSArray 时应用程序崩溃

如何在 NSUserDefaults 中绑定 NSDictionary 中的对象?

从 NSUserDefaults 读取数据