NSMUTABLEDINY no puede tener "tiempo" para leer objetos (nsmutableString s)
-
23-10-2019 - |
Pregunta
Estoy configurando el texto de las etiquetas con el contenido de nsmutableString_s que son objetos de una nsmutableRictionRay ... el problema que todas las cosas funcionan bien cuando cargo la página por dos veces (así que presiono, después de que explico ...) y Con el tercer empuje, el programa no puede leer el contenido de uno de los nsmutableString_s del NSMUTABLEDARY ... así que cuando gira hacia el paso de establecer el valor del uilabel no encontró el valor ...
Existe el código donde aparece la excepción:
- (void)viewDidLoad{
[super viewDidLoad];
NSMutableDictionary *item=[days objectAtIndex:0];
NSString *title1=[item objectForKey:@"week_day"];
name1.text=title1;
[title1 release];
Solución
No deberías liberar title1
- No es dueño de la cadena devuelta por -objectForKey:
y no tomó posesión al retenerlo.
Sugiero leer el Guía de gestión de memoria de cacao para evitar eso en el futuro.
Asumiendo que text
es un retain
Propiedad: con cadenas mutables, debe asignar copias de la cadena para evitar que se cambien bajo usted:
NSString *title1 = [[item objectForKey:@"week_day"] copy];
name1.text = title1;
[title1 release]; // copy means taking ownership, so release
El siguiente es un ejemplo simplificado de lo que podría estar sucediendo con su código como se publicó:
// entering -viewDidLoad the first time:
NSString *title1=[item objectForKey:@"week_day"];
// lets assume that the strings retain count is 1 here
name1.text=title1;
// setter retains, retain count now 2
[title1 release];
// retain count now 1
// entering -viewDidLoad the second time:
NSString *title1=[item objectForKey:@"week_day"];
// assuming nothing else did retain it, strings retain count is still 1
name1.text=title1;
// you assigned the same object, retain count still 1
[title1 release];
// strings retain count now 0 - will be deallocated :(
Otros consejos
Gracias a todos, ahora funciona bien cuando escapo de la transición con variables intermedias, ¡pero lo que no entendí por qué funciona para las dos acciones "empujando" antes!
name1.text=[[days objectAtIndex:0] objectForKey:@"week_day"];