web-dev-qa-db-fra.com

Erreurs NSUserDefaults dans les journaux

Je reçois des messages d'erreur dans les journaux

 [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))

Qu'est-ce qui cause cela?

C'est ainsi que j'utilise 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];
}
19

Beaucoup de gens trouvent ce problème sur Xcode 8.

"Aussi fou que cela puisse paraître, essayez de redémarrer votre téléphone et votre hôte, parfois, Xcode peut rester bloqué pour des raisons de somme, seul le redémarrage peut vous aider.

compilez avec Xcode 8.1 Beta et vous verrez le même avertissement, mais vous obtiendrez également la valeur. "

référence: https://forums.developer.Apple.com/thread/51348

28
Tushar

Je recevais une erreur similaire:

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

mais cela ne s'est produit que lorsque j'ai été branché sur Xcode.

Un redémarrage de l'appareil a résolu ce problème.

2
Lee Probert

Je viens d'avoir la même erreur. L'erreur pour moi était que j'ai appelé synchroniser plusieurs fois. 

En appelant [userDefaults synchronize] une seule fois, tous les messages d'erreur ont disparu.

1
Milander

si vous rencontrez ce problème lorsque vous essayez de sauvegarder des données dans l'extension APP à l'aide de userDefault, vous avez peut-être écrit ce code: [[NSUserDefaults standardUserDefaults] initWithSuiteName: @ "group.xxx.com"] ;, ce code est réinitialisé. défaut utilisateur par défaut. En fait, le code correct est: [[NSUserDefaults alloc] initWithSuiteName: @ "group.xxx.com"]; http://www.jianshu.com/p/e782104c3bc3

1
H u Y an g

Je voudrais partager ma solution pour ce problème. Pour mon cas, l'erreur était une erreur légitime et mes données n'étaient pas enregistrées correctement. Il s'avère que l'erreur a été provoquée par le fait que NSUserDefaults a "sauvegardé les données" dans une boucle. 

Par "sauvegarde des données", j'entends ceci (pseudocode):

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

Donc, le code s'exécute plusieurs fois très rapidement et cause le problème ... Je suppose que "synchroniser" ne peut pas gérer les appels simultanés.

Ce qu'il faut faire, c'est:

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

synchronize être appelé une fois après que tous les objets aient été définis. 

0
GeneCode

Je viens de supprimer l'application et de réinstaller via Xcode. Utiliser XCode 8.2.1.

0
sigrem