Ошибки 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];
}
Ответы
Ответ 1
Многие люди находят эту проблему на Xcode 8.
"Как сумасшедший, как кажется, попробуйте перезагрузить телефон и хост, иногда Xcode может застрять на сумму, потому что только перезагрузка помогает.
построить с помощью Xcode 8.1 Beta, и вы увидите то же предупреждение, но вы также получите значение. "
ссылка: https://forums.developer.apple.com/thread/51348
Ответ 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.
Перезагрузка устройства исправлена.
Ответ 3
Если вы столкнулись с этой проблемой при попытке сохранить данные в APP расширения с помощью userDefault, возможно, вы написали этот код: [[NSUserDefaults standardUserDefaults] initWithSuiteName: @ "group.xxx.com" ]; этот код reset по умолчанию userDefault. На самом деле, правильный код: [[NSUserDefaults alloc] initWithSuiteName: @ "group.xxx.com" ];
http://www.jianshu.com/p/e782104c3bc3
Ответ 4
У меня была такая же ошибка. Ошибка для меня заключалась в том, что я вызывал синхронизацию несколько раз.
Вызовите [userDefaults synchronize] только после того, как все сообщения об ошибках исчезли.
Ответ 5
Я просто удалил приложение и снова установил его через Xcode. Использование XCode 8.2.1.
Ответ 6
Я хочу поделиться своим решением по этой проблеме. Для моего случая ошибка была законной ошибкой, и мои данные не были сохранены должным образом. Оказывается, ошибка была вызвана тем, что NSUserDefaults "сохраняет данные" в цикле.
Под "сохранением данных" я имею в виду это (псевдокод):
loop{
[defaults setObject:@"Data" forKey:@"Key"];
[defaults synchronize];
}
Таким образом, код выполняет это несколько раз очень быстро и вызывает проблему.
Я думаю, что "synchronize" не может обрабатывать одновременные вызовы.
Что нужно сделать:
loop{
[defaults setObject:@"Data" forKey:@"Key"];
}
[defaults synchronize];
synchronize вызывается один раз после того, как все объекты были установлены.