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];
}
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. "
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.
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.
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
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.
Je viens de supprimer l'application et de réinstaller via Xcode. Utiliser XCode 8.2.1.