日志中的 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 App 和 Todays Extension 之间共享数据
在 NSUserDefaults 中存储 NSArray 时应用程序崩溃