ios objective-c cocoa-touch nsuserdefaults

ios - Borrar NSUserDefaults



objective-c cocoa-touch (15)

Estoy usando +[NSUserDefaults standardUserDefaults] para almacenar la configuración de la aplicación. Esto consiste en aproximadamente una docena de valores de cadena. ¿Es posible eliminar estos valores de forma permanente en lugar de simplemente establecerlos en un valor predeterminado?


¿Intentaste usar - removeObjectForKey ?

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];


Ampliando la respuesta de @ folse ... Creo que una implementación más correcta sería ...

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain]; for (NSString *key in [defaultsDictionary allKeys]) { NSLog(@"removing user pref for %@", key); [[NSUserDefaults standardUserDefaults] removeObjectForKey:key]; }

... llamando al método persistentDomainForName de NSUserDefault:. Como lo indica el documento, el método "Devuelve un diccionario que contiene las claves y los valores en el dominio persistente especificado". Calling dictionaryRepresentation: en cambio, devolverá un diccionario que probablemente incluirá otras configuraciones según se aplique a un alcance más amplio.

Si necesita filtrar alguno de los valores que se van a restablecer, la iteración de las claves es la forma de hacerlo. Obviamente, si solo quiere eliminar todas las preferencias de la aplicación sin tener en cuenta, entonces uno de los otros métodos publicados anteriormente es el más eficiente.


Aquí está la respuesta en Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier! NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)


En Swift:

let defaults = NSUserDefaults.standardUserDefaults() defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }



Es un error o lo que sea, pero removePersistentDomainForName no funciona al borrar todos los valores de NSUserDefaults .

Entonces, la mejor opción es que reinicie el PersistentDomain y que puede hacer de la siguiente manera:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)


Este código restablece los valores predeterminados al dominio de registro:

[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

En otras palabras, removeObjectForKey para cada clave que haya registrado en esa aplicación.

Créditos a Ken Thomas en este thread. foros de desarrolladores de Apple thread.


Intenta esto, está funcionando para mí.

Una sola línea de código

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


Me encantan las extensiones cuando hacen el código más limpio:

extension NSUserDefaults { func clear() { guard let domainName = NSBundle.mainBundle().bundleIdentifier else { return } self.removePersistentDomainForName(domainName) } }


Puede eliminar el dominio persistente de la aplicación de esta manera:

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

En Swift 3 y más tarde:

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

Esto es similar a la respuesta de @samvermette pero es un IMO un poco más limpio.



Si lo necesita mientras desarrolla, también puede reiniciar su simulador, eliminando todos los NSUserDefaults .

Simulador de iOS -> Restablecer contenido y configuración ...

Tenga en cuenta que también eliminará todas las aplicaciones y archivos en el simulador.


Todas las respuestas anteriores son muy relevantes, pero si alguien sigue sin poder restablecer los valores predeterminados del usuario para la aplicación eliminada, entonces puede restablecer la configuración de contenido de su simulador y funcionará.


Nota: Esta respuesta también se ha actualizado para Swift.

¿Qué hay de tenerlo en una línea?

Extendiendo la respuesta de @Christopher Rogers - la aceptada.

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

y sí, en algún momento es posible que tengas que synchronize ,

[[NSUserDefaults standardUserDefaults] synchronize];

He creado un método para hacer esto,

- (void) clearDefaults { [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]; [[NSUserDefaults standardUserDefaults] synchronize]; }

Swift ?

Con swift es aún más fácil.

extension UserDefaults { class func clean() { guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false } self.standard.removePersistentDomain(forName: aValidIdentifier) self.standard.synchronize() } }

Y uso :

UserDefaults.clean()


NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; for (NSString *key in [defaultsDictionary allKeys]) { [[NSUserDefaults standardUserDefaults] removeObjectForKey:key]; }