Así que sí, soy un chico de Java en este loco mundo de iPhone. Cuando se trata de la gestión de la memoria, todavía no tengo una idea muy clara de lo que estoy haciendo.¿Cómo manejo la memoria UIViewControllers con un controlador de navegación?
tengo una aplicación que utiliza un controlador de navegación, y cuando es el momento de pasar a la siguiente vista tengo código que se parece a esto:
UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView"
bundle:[NSBundle mainBundle];
[[self navigationController] pushViewController:myController animated:YES];
Ahora bien, según norma fundamental de Apple en la gestión de memoria
tomar posesión de un objeto si se crea empleando un método cuyo nombre comienza con “alloc” o “nuevo” o contiene “copia” (por ejemplo,
alloc
,newObject
omutableCopy
), o si envía es unretain
mensaje Usted es responsable de renunciar a la propiedad de los objetos que posee usandorelease
oautorelease
. En cualquier otro momento que reciba un objeto, no debe liberarlo.
Para mí eso significa que debería estar liberando myController
, o dándole un mensaje de autorelease
. Pero, cada vez que trato de hacerlo, mi aplicación se cuelga cuando presiono y saco vistas de la pila.
Esto no me olía bien, pero al ejecutar Instruments dice que no tengo ninguna pérdida de memoria.
Así que mi pregunta es
- estoy haciendo esto correcto?
- ¿El controlador de navegación es el propietario de MyViewController, explicando la falta de una pérdida de memoria?
- ¿Debo asignar myController a una variable de instancia en mi ViewController raíz? En ese caso, estaría marcado retener y me liberaría en el método de la raíz dealloc
Estaba simplemente contrastando el uso de la liberación automática con liberación. Puedes soltar de forma automática antes o después, no importa, pero si lo sueltas, DEBES hacerlo después. –