iphone objective-c ios xcode nsuserdefaults

iphone - ¿Hay algún límite en el almacenamiento de valores en NSUserDefaults?



objective-c ios (9)

Como ya he mencionado, no conozco ninguna limitación de TAMAÑO (excepto la memoria física) para almacenar datos en un .plist (por ejemplo, UserDefaults). Entonces no es una cuestión de CUÁNTO.

La verdadera pregunta debería ser ¿CON QUÉ FRECUENCIA usted escribe valores nuevos / modificados ... Y esto está relacionado con el drenaje de la batería que esto causará?

IOS no tiene ninguna posibilidad de evitar una escritura física en "disco" si se cambia un solo valor, solo para mantener la integridad de los datos. Con respecto a UserDefaults, esto causa que todo el archivo se reescriba en el disco.

Esto enciende el "disco" y lo mantiene encendido durante más tiempo y evita que el IOS pase a un estado de baja energía.

De "Guía de eficiencia energética para aplicaciones de iOS":

Minimice las escrituras de datos. Escriba en los archivos solo cuando su contenido haya cambiado y agregue los cambios en una sola escritura siempre que sea posible. Evite escribir un archivo completo si solo han cambiado unos pocos bytes. Si cambia con frecuencia porciones pequeñas de archivos grandes, considere usar una base de datos para almacenar los datos.

Las LECTURAS no son un problema, ya que todos los valores se guardan en la memoria.

Soy nuevo en el desarrollo de iPhone y el objective C He usado NSUserDefaults para almacenar algunos valores en mi aplicación. Pero no sé si hay algún límite para almacenar valores en NSUserDefaults . ¿Alguien puede ayudarme a saber eso?

Gracias por adelantado.


De los códigos SDK de iOS y el documento oficial de Apple relacionado. .

extension UserDefaults { /*! NSUserDefaultsSizeLimitExceededNotification is posted on the main queue when more data is stored in user defaults than is allowed. Currently there is no limit for local user defaults except on tvOS, where a warning notification will be posted at 512kB, and the process terminated at 1MB. For ubiquitous defaults, the limit depends on the logged in iCloud user. */ @available(iOS 9.3, *) public class let sizeLimitExceededNotification: NSNotification.Name // .... }


Resumen

  1. Actualmente no hay límite para los valores predeterminados del usuario local
  2. En TVOS , donde se publicará una notificación de advertencia a 512kB, y el proceso finalizará en 1MB.
  3. Para los valores predeterminados omnipresentes, el límite depende del usuario de iCloud conectado.

Existen límites sobre los tipos que puede almacenar: todos deben ser objetos de la Lista de propiedades, a saber, NSNumber , NSData , NSData , NSArray y NSDictionary . Además, solo puede almacenar NSArray y NSDictionary si los valores también son objetos de lista de propiedades; también, todas las llaves del NSDictionary deben ser cuerdas.

Tenga en cuenta que un objeto como UIColor no se encuentra en la lista anterior. Por lo tanto, si desea almacenar un color en la base de datos predeterminada, primero deberá convertirlo en una cadena o en un objeto de datos, y luego convertirlo cuando lea los valores predeterminados.

En cuanto a los límites de tamaño, no hay ninguno que esté documentado, pero tenga en cuenta que todos los datos se almacenarán como un archivo de lista de propiedades. El archivo completo se lee y se escribe como un todo, por lo que si usa NSUserDefaults para almacenar una gran cantidad de datos que solo cambian en partes, perderá mucho tiempo haciendo E / S innecesarias.


La única limitación de almacenamiento en NSUserDefaults es la capacidad de almacenamiento del dispositivo .

Por mucho que haya espacio de almacenamiento disponible en un dispositivo iOS , prácticamente puede almacenar datos en NSUserDefaults . El par clave - valor se almacena en un archivo estructurado xml (. Plist ) que se almacena en un paquete de aplicaciones .

El sistema predeterminado del usuario y el almacén de valores-clave están diseñados para almacenar tipos de datos simples: cadenas , números , fechas , valores booleanos , URLs , objetos de datos , etc. en una lista de propiedades . El uso de una lista de propiedades también significa que puede organizar sus datos de preferencia usando tipos de matriz y diccionario. También es posible almacenar otros objetos en una lista de propiedades NSData primero en un objeto NSData .


Lo que sea que el tamaño de archivo máximo permitido esté en la unidad. ¡Puedes usar esta pieza de código para comprobarlo!

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *myKey = @"key"; int sizeOfFile = 1024; // Fill in proper file size here NSData myObject; NSString *someFilePath = @"PathToYourFileHere"; for(int i = 1; i < 9999999999999999; i++) { myObject = [NSData dataWithContentsOfFile:someFilePath]; [defaults setObject:myObject forKey:[NSString stringWithFormat:@"%@%i", myKey, i]]; NSLog(@"Iteration: %i, TotalWritten: %i", i, i * sizeOfFile); }


No hay límite para almacenar valores en NSUserDefaults.


Por lo que yo sé, no hay límite para almacenar en NSUserdefaults.


Siempre que haya suficiente espacio en el iPhone / iPad, puede almacenar valores NSUserDefault. Todos esos valores se almacenan en un archivo .plist, y este archivo es muy pequeño, la mayoría de las veces debajo de 1 kb (a menos que almacene una gran cantidad de datos).


Todos respondieron la pregunta directa de "¿hay un límite?" Sin embargo, encontré este hilo realmente buscando entender " ¿cuánto es demasiado para almacenar en UserDefaults?"

Si estás buscando esa respuesta, aquí hay un thread útil. Las respuestas que encontré útiles fueron para ir a su archivo de proyecto y mirar el tamaño del archivo plist:

5 objetos es casi nada. ¡Estarás bien!

En mi máquina, tengo 28 megas de datos en mis valores predeterminados de usuario. Eso no está causando ningún problema en absoluto.

A partir de la experiencia de programación general con matrices, supongo que el rendimiento comienza a decaer rápidamente cuando ingresa a los 1000, dependiendo del tamaño del elemento. Por lo tanto, en un programa no tendría problemas para almacenar un par de cientos de elementos. Dicho esto, probablemente comenzaría a usar una base de datos sqlite3 o coredata, más temprano que tarde si fuera usted.

Importante recordar:

Lo anterior alivió mis preocupaciones de que mi creciente número de incumplimientos (alrededor de 20-25 ahora) causaría problemas. Ya uso CoreData, por lo que estaba considerando cuál usar ya que mi número de preferencias / personalizaciones de usuario permitidas está creciendo mucho. Por lo tanto, me quedaré con los valores predeterminados del usuario.

Sin embargo , como han señalado otras respuestas, el archivo se leerá y escribirá como un todo. Entonces, leer 20 diccionarios de clave / cadena y 5 diccionarios clave / booleanos solo para recuperar una cadena ... no es exactamente lo ideal. No obstante, si no perjudica el rendimiento y te ahorra una tonelada de código, ¿por qué no?