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];
¿Fue útil?

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"];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top