Подтвердить что ты не робот

Ошибки 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];
}
4b9b3361

Ответ 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 вызывается один раз после того, как все объекты были установлены.