ios objective-c nsuserdefaults

¿Por qué se usa NSUserDefaults en iOS?



objective-c (5)

NSUserDefaults se usa para guardar pequeñas porciones de datos de los que depende la aplicación para ejecutarse correctamente, mientras que otros enfoques son buenos para almacenar grandes cantidades de datos con los que la aplicación funciona.

NSUserDefaults hace que sea increíblemente fácil, ya que no tiene que preocuparse por los archivos, entidades, búsquedas, ... Todo se hace en una sola línea.

Soy nuevo en el desarrollo de iOS y en el desarrollo de aplicaciones móviles en general, tengo un conocimiento decente sobre los patrones de Objective C y MVC que se utilizarán y nunca he hecho ningún desarrollo de Mac.

Estoy luchando para entender para qué NSUserDefaults ?

Ya tenemos algo como PList que almacena datos como XML y tenemos SQLite que es un DB ligero para tales dispositivos.

Entonces, ¿por qué lo tenemos?

¿Es una alternativa simple de almacenamiento de valor-clave para nuestra aplicación de la misma manera que tenemos diferentes tipos de almacenamiento en la nube como un RDBMS y un almacén de NoSQL basado en valores-clave, etc.?

Para NSUserDefaults , los documentos de Apple dicen que:

"Las aplicaciones registran dichas preferencias asignando valores a un conjunto de parámetros en la base de datos predeterminada de un usuario"

¿Qué quieren decir con la base de datos predeterminada del usuario?

Mi conjetura es que, como en cualquier sistema operativo multiusuario, tenemos varias cuentas de usuario y de la misma manera en Mac, también podríamos tener múltiples usuarios, cada uno con una base de datos desde donde las aplicaciones cargarían las preferencias guardadas para ese usuario.

Entonces, al igual que Mac OS X, ¿iOS también tiene múltiples usuarios y, dependiendo de lo que se haya registrado en NSUserDefaults elige sus preferencias?

Por favor, dime si estoy equivocado.


Originalmente es para almacenar configuraciones, pero parece que se usa (ab) para muchas otras cosas si las preguntas sobre SO son algo que se debe responder. El "punto" de esto es que proporciona un método de recuperación y persistencia de datos de una sola línea para una amplia gama de tipos de datos.

No hay una configuración multiusuario (¿todavía?) En iOS (¿alguna vez tuvo que iniciar sesión en su iPhone?) Que está integrada en NSUserDefaults, pero como OS X y iOS están construidos sobre la misma base, la misma clase es Utilizado para ambos sistemas operativos.


Una cosa que aún no se ha mencionado: NSUserDefaults admite todos los tipos escalares básicos (float, int, BOOL), así como los tipos compatibles con plist: NSData, NSString, NSNumber, NSDate, NSArray y NSDictionary. (Mencionó plists como alternativa: NSUserDefaults es solo una interfaz para un archivo plist estándar en la carpeta de Preferencias de la aplicación). Esto facilita la creación de almacenamiento persistente para el estado de su aplicación en solo unas pocas líneas de código. Aún mejor, si implementa NSCoding en sus objetos modelo, puede archivarlos en un NSData y ponerlos en NSUserDefaults:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:arrayOfModelObjects]; [[NSUserDefaults standardUserDefaults] setObject:data forKey:kDefaultsKeyModelObjects];

y restaurar los datos de tu aplicación es tan simple como

- (void)viewDidLoad { NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultsKeyModelObjects]; arrayOfModelObjects = [[NSKeyedUnarchiver unarchiveRootObject:data] retain]; // error checking, tell UI to load the new values, etc... }

(kDefaultsKeyModelObjects es una constante de cadena que ha definido en algún lugar. Siempre coloque sus claves NSUserDefaults en un solo lugar. Tener un error tipográfico en el nombre de una clave puede demorar horas en depurarse. :)

Si usó, por ejemplo, SQLite para almacenar los datos de su aplicación, tiene que escribir una gran cantidad de código para mover los datos del modelo dentro y fuera de la base de datos. Eso tiene sentido si está tratando con una gran cantidad de datos, necesita una búsqueda eficiente, etc .; pero si es, digamos, una lista de servidores en una aplicación de red, es más fácil y limpio lanzarlos en NSUserDefaults.

Una última cosa: NSUserDefaults es ideal para la creación de prototipos. Incluso si sabe que finalmente va a necesitar una tienda SQLite, puede comenzar a usar NSUserDefaults como una tienda persistente rápida y fácil, y hacer que su interfaz de usuario funcione y su modelo de datos se complete antes de escribir un montón de código de base de datos.

Entonces, al igual que Mac OS X, ¿iOS también tiene múltiples usuarios y, dependiendo de lo que se haya registrado en NSUserDefaults, elige sus preferencias?

No, en iOS la lista de valores predeterminados se encuentra en la carpeta Biblioteca / Preferencias de la aplicación, no en una carpeta específica del usuario como en OS X. No puedo imaginar que iOS tenga múltiples inicios de sesión, pero nunca se sabe. Si lo hiciera, tendrían que hacer listas de valores predeterminados por separado para diferentes usuarios.


iOS es un sistema operativo de un solo usuario. Por lo tanto, NSUserDefaults se usa de manera diferente en OSX e iOS.

En iOS, normalmente se usa NSUserDefaults para guardar las preferencias de la aplicación y / o los datos del usuario en el "sistema predeterminado de iOS". Los datos guardados en el sistema predeterminado serán persistentes en todo momento, incluso cuando reinicies el dispositivo iOS. De hecho, incluso cuando el usuario actualiza la aplicación.

Normalmente desea usar NSUserDefaults para guardar las preferencias / configuraciones de la aplicación. Cualquier otro dato masivo, como datos de juegos o cálculos en tiempo real, debe guardarse en CoreData o sqllite en el directorio de documentos.


NSUserDefaults almacena valores solo para su aplicación.

Nota: no pretende servir como reemplazo de un almacén tradicional para datos (Core Data, SQLite, Listas de propiedades, etc., para almacenar datos de aplicaciones). Lo que significa NSUserDefaults es para pares de valores clave específicos.

Por ejemplo, lo uso para almacenar el ID de red y el nombre completo de un usuario autenticado una vez que se realiza el proceso de inicio de sesión. Al finalizar la sesión o cerrar sesión, borro esos valores. Para esto NSUserDefaults brilla.