En mi aplicación escribo múltiples cadenas a la base de datos por defecto, así:¿Por qué NSUserDefaults devuelve una cadena desasignada? (Actualización # 2)
[[NSUserDefaults standardUserDefaults] setObject:@"Hi" forKey:@"GREETING"];
Cuando llamo varias veces durante mi tiempo de vida de aplicaciones esto, entonces terminan con un error en el consola después de pasar por encima de este código:
NSString *val = [[NSUserDefaults standardUserDefaults] objectForKey:@"someKey"];
aquí con más detalle:
Como se puede ver que tengo un punto de interrupción exactamente en la línea con la llamada al método a -stringForKey:
de NSUserDefaults
. ¡Después de pasar, el choque ya ocurre! No hay posibilidad de siquiera leer lo que está en val
. ¡Está desasignado!
Esto sucede con CUALQUIER cadena que puse en NSUserDefaults, desde CUALQUIER LUGAR, y no estoy haciendo nada incorrecto con la administración de memoria. Leaks Instrument es perfecto, al igual que los resultados del Clang Static Analyzer. error
Console:
*** -[CFString retain]: message sent to deallocated instance 0x610ba10
Top de seguimiento de la pila en depurador después de accidente: (línea superior lee reenvío de)
símbolos de código de Máquina:
Ahora la parte REALMENTE extraña: tengo un controlador de vista que carga una interfaz de usuario pesada. Cuando destruyo esta vista y la cargo, y la destruyo nuevamente y la vuelvo a cargar, THEN NSUserDefaults está muerto. Bloquear tan pronto como quiera leer una cadena de NSUserDefaults. Es absolutamente siempre el mismo comportamiento.
Pensé que tal vez haya una pérdida de memoria que devora toda la memoria RAM. Pero esto sucede tanto en una gran máquina de desarrollo como en el iPad. Libere y vuelva a cargar la vista dos veces y NSUserDefault tenga este defecto.
Sólo para asegurarse de que no es mi culpa, yo re-escribí mis NSUserDefaults escribir código para algo como esto:
[[NSUserDefaults standardUserDefaults] setObject:[theString copy] forKey:key];
Pero aún así, termino con la obtención de las instancias de cadenas desasignado de NSUserDefaults! ¡En el simulador y en el dispositivo! Además, algunas de esas cadenas que intento acceder a haber sido escritos por defecto al inicializar la aplicación en + (void)initialize
NSDictionary *preSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
@"Hollywood", @"defaultCity",
nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:preSettings];
Así que incluso si no cambio esta cadena para la tecla @ "defaultCity y quiero acceder a ella después de un tiempo (cuando volví a cargar esa vista grasa dos veces), termino obteniendo una instancia desasignada de NSUserDefaults.
También traté de reiniciar todo, llamando manualmente a mi método en el delegado de la aplicación que registra ese diccionario predeterminado con NSUserDefaults. No ayuda nada.
He hecho 100% seguro de que th No hay fugas de memoria (probadas en exceso con el instrumento Leaks). No entiendo por qué sucede esto.También intenté retener esas cadenas 5 veces antes de escribirlas en NSUserDefaults (lo que de todos modos sería estúpido), sin éxito.
Ideas?
¡PROBLEMA SOLUCIONADO!
Una de las cadenas devuelta por NSUserDefaults se asignó a una propiedad de retención. Me olvidé de agregar un self.
delante de self.theProperty = theStringFromNSUserDefaults
que dio como resultado la liberación excesiva de esa cadena en -dealloc cuando la vista fue desasignada.
Aunque es extraño, que pude cargar, destruir, cargar y destruir esa vista. Y luego sucedió en el primer intento de leer cualquier cadena de NSUserDefaults. Es como una cadena desasignada que se propaga a través del diccionario predeterminado o de la base de datos predeterminada y lo desglosa todo, lo que conduce a los algoritmos NSUserDefaults y NSDictionary notally nuts.
Después de corregir ese error único todo funcionó bien. Incluye acceso a todas las demás cadenas en NSUserDefaults también. Funciona, pero sigue siendo un misterio cómo este único olvidado self.
tuvo un impacto tan grande.
Gracias a todos los que ayudaron a resolver este problema. Me salvaste de un ataque al corazón. Estaba tan cerca de eso. Bueno, debo comprar algo nuevo ahora ... mi oficina se parece a la habitación de Star Gate después de un ataque Goa'uld.
Se puede publicar su código para guardar la cadena en NSUserDefaults? – iMOBDEV
Sí, verifique mi respuesta actualizada. – openfrog