ios objective-c xcode nsuserdefaults

ios - Errores de NSUserDefaults en los registros



objective-c xcode (6)

Acabo de eliminar la aplicación y la instalé nuevamente a través de Xcode. Utilizando XCode 8.2.1.

Recibo algunos mensajes de error en los registros

[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é causa esto?

Así es como uso 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]; }


Acabo de tener el mismo error. El error para mí fue porque llamé a sincronizar varias veces.

Al llamar a [userDefaults synchronize] solo una vez que desaparecieron todos los mensajes de error.


Estaba recibiendo un error similar:

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

pero solo sucedió cuando me conecté a Xcode.

Un reinicio del dispositivo solucionó esto.


Me gustaría compartir mi solución para este problema. En mi caso, el error fue un error legítimo y mis datos no se guardaron correctamente. Resulta que el error fue causado por tener un NSUserDefaults "data saving" en un bucle.

Por "guardar datos" me refiero a esto (pseudocódigo):

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

Entonces el código ejecuta esto varias veces muy rápido y causa el problema. Supongo que "sincronizar" no puede manejar llamadas concurrentes.

Lo que hay que hacer es:

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

sincronizar ser llamado una vez después de que todos los objetos han sido establecidos.


Mucha gente está encontrando este problema en Xcode 8.

"Por loco que parezca, intente reiniciar el teléfono y el host, a veces Xcode se puede atascar por una suma total, por lo que solo el reinicio ayuda.

compile con Xcode 8.1 Beta y verás la misma advertencia, pero también obtendrás el valor. "

referencia: https://forums.developer.apple.com/thread/51348


si tiene este problema cuando intenta guardar datos en la extensión de la AP utilizando userDefault, quizás haya escrito este código: [[NSUserDefaults standardUserDefaults ] initWithSuiteName: @ "group.xxx.com"] ;, este código restablece el usuario predeterminado predeterminado. En realidad, el código correcto es: [[NSUserDefaults alloc ] initWithSuiteName: @ "group.xxx.com"]; http://www.jianshu.com/p/e782104c3bc3