Eliminar todas las keys de un iOs del dictionary NSUserDefaults

Utilizo el dictionary NSUserDefaults para almacenar información básica, como puntuaciones altas, etc., de modo que cuando el usuario cierra los datos de la aplicación no se pierde. De todos modos yo uso:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

para almacenar datos Si deseo almacenar una nueva puntuación alta, por ejemplo, entonces haría lo siguiente:

 [prefs setInteger:1023 forKey:@"highScore"]; [prefs synchronize]; //this is needed in case the app is closed. 

y más tarde si deseo recuperar el puntaje más alto que haría:

 [prefs integerForKey:@"highScore"]; 

de todos modos el punto es que NSUserDefaults enable muchas otras cosas porque NSUserDefaults enable te permite almacenar booleans , integers , objects , etc. ¿Qué método tendré que ejecutar para eliminar todas las keys de modo que NSUserDefaults se convierta en la primera vez que ejecuto la aplicación?

Estoy buscando algo como:

 NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs deleteAllKeysAndObjectsInTheDictionary]; 

o tal vez hay una manera de get todas las keys y tengo que recorrer cada object, pero no sé cómo eliminarlas.

EDITAR:

Yo he tratado :

 NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [NSUserDefaults resetStandardUserDefaults]; [prefs synchronize]; 

y todavía puedo recuperar una puntuación alta …

Si echa un vistazo a la documentation de NSUserDefaults , verá un método - (NSDictionary *) dictionaryRepresentation . Al usar este método en los valores pnetworkingeterminados del usuario estándar, puede get una list de todas las keys en los valores pnetworkingeterminados del usuario. A continuación, puede usar esto para borrar los valores pnetworkingeterminados del usuario:

 - (void)resetDefaults { NSUserDefaults * defs = [NSUserDefaults standardUserDefaults]; NSDictionary * dict = [defs dictionaryRepresentation]; for (id key in dict) { [defs removeObjectForKey:key]; } [defs synchronize]; } 

La forma más corta de hacerlo con los mismos resultados como en la respuesta principal de Alex Nichol:

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; 

Un trazador de líneas

 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]; 

+ (void) resetStandardUserDefaults no persiste los cambios, simplemente restablece el object pnetworkingeterminado de usuario en memory para que la próxima llamada de synchronize se lea desde la copy en el disco, en lugar de sobrescribir los valores existentes en la memory con el disco en versiones

Iterando sobre las keys es mejor, pero en realidad hay una function que hace esto por ti: removePersistentDomainForName:

 // you can usually get the domain via [[NSBundle mainBundle] bundleIdentifier] [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]; // or use a string for any other settings domains you use //[[NSUserDefaults standardUserDefaults] // removePersistentDomainForName:@"com.mycompany.myappname"]; [[NSUserDefaults standardUserDefaults] synchronize]; 

Al final de la operación de synchronize , tanto el disco como las copys de memory de los valores por defecto del usuario no contendrán ninguno de los valores establecidos por su aplicación.

Versión Swift:

 if let bid = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid) } 

Solución simple

C objective:

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; 

En Swift 3.0:

 if let appDomain = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: appDomain) } 

Para Swift 3:

 let appDomain = Bundle.main.bundleIdentifier! UserDefaults.standard.removePersistentDomain(forName: appDomain) 

Para Swift 3:

 if let bundle = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: bundle) } 

Para aquellos de ustedes que quieran hacer esto en el objective de testing, use esto (ya que removePersistentDomain no funciona para ese caso)

Swift 3:

 for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) { UserDefaults.standard.removeObject(forKey: key) } 

Oneliner en Swift:

Swift 3

 NSUserDefaults.standardUserDefaults().removePersistentDomainForName( NSBundle.mainBundle().bundleIdentifier!) 

Swift 4

 UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) 

Swift 2.3:

 if let bundleIdentifierBinded = NSBundle.mainBundle().bundleIdentifier{ NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bundleIdentifierBinded) } 

Rápido

  func resetUserDefaults(){ let userDefaults = NSUserDefaults.standardUserDefaults() let dict = userDefaults.dictionaryRepresentation() as NSDictionary for key in dict.allKeys { userDefaults.removeObjectForKey(key as! String) } userDefaults.synchronize() } 

¿Este método no lo hace?

 + (void)resetStandardUserDefaults 

De la documentation para NSUserDefaults :

resetStandardUserDefaults

Sincroniza los cambios realizados en el object pnetworkingeterminado de usuario compartido y lo libera de la memory.

+ (void)resetStandardUserDefaults

Discusión

Una invocación posterior de standardUserDefaults crea un nuevo object pnetworkingeterminado de usuario compartido con la list de búsqueda estándar.

En base a esto, puede hacer lo siguiente:

 [NSUserDefaults resetStandardUserDefaults]; [NSUserDefaults standardUserDefaults]; 

y ahora los valores pnetworkingeterminados deben restablecerse.

Swift 3 o 4 Incluso podemos simplificar el fragment descrito en esta expresión moderna:

 func clearAll() { let settingsDictionary = userDefaults.dictionaryRepresentation() settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) } userDefaults.synchronize() }