2008-10-30 15 views
6

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 o mutableCopy), o si envía es un retain mensaje Usted es responsable de renunciar a la propiedad de los objetos que posee usando release o autorelease. 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

  1. estoy haciendo esto correcto?
  2. ¿El controlador de navegación es el propietario de MyViewController, explicando la falta de una pérdida de memoria?
  3. ¿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

Respuesta

3

@Ben Gottlieb ¿por qué es necesario volver a soltarlo antes de presionarlo? Retener al recuento de asignación de objetos es 1, autorelease antes o después de empujar no afecta a la cuenta de retención, aunque por lo general autoreleasing como una cuestión de estilo se aplica afer objeto alloc/init:

[[[object alloc] init] autorelease]; 

@bpapa,

2) Al presionar, el controlador de navegación retendrá el controlador de vista. Más tarde, cuando esta vista salga de la pila del controlador de navegación, el controlador de navegación la lanzará.

3) A menos que exista un motivo explícito para conservar esa vista, no debe asignarla a una variable de instancia. En general, desea que sus vistas solo existan mientras las necesite.

+0

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. –

9

El problema es (lo más probable) que está liberando su viewController antes del regulador de la navegación tiene la oportunidad de reclamar la propiedad. Hay dos maneras de evitar esto:

  • -release su controlador después de empujar a la Nav Controller
  • -autorelease su controlador antes de empujarla. Si hace esto, el NSAutoreleasePool activo (del que no debe preocuparse) se encargará de liberar su controlador más adelante.
Cuestiones relacionadas