2009-12-03 27 views
8

Tengo un código muy simple para mostrar un controlador modal (nextController es un miembro de la clase):dismissModalViewControllerAnimated no va a liberar cualquier memoria

nextController = [[InstructionsScreen alloc] initWithNibName:@"InstructionsScreen" bundle:nil]; 
[self presentModalViewController:nextController animated:YES]; 
[nextController release]; 

Y luego, cuando el controlador debe ocultar:

[self dismissModalViewControllerAnimated:YES]; 
nextController = nil; 

Todo funciona bien como se esperaba, pero cuando ejecuto las asignaciones de objetos del instrumento, muestra que después de descartar el controlador modal, la memoria asignada no se libera. Esto se convierte en un problema porque cuando muestro varios controladores, la memoria ha terminado ...

¿Alguien puede darme algunas pistas? Clang no ve ningún problema, por lo que estoy atascado al llegar al límite de la memoria, porque la memoria de los controladores eliminados no se liberará.


EDIT: Lo que he descubierto hasta ahora es que parece haber una fuga en alguna parte de la materia de Apple. Forma de reproducir: XCode -> crear nuevo proyecto con la plantilla "Aplicación de utilidad". No escriba ningún código usted mismo. Simplemente cree una nueva aplicación de utilidad y ejecútela con "Asignaciones de objetos", elija ver "Creado & Aún vivo". Ahora voltee el controlador modal varias veces: verá que la memoria asignada solo crece y crece cada vez que aparece el controlador modal y cuando también está desapareciendo ...

Respuesta

0

Las vistas modales no son subvistas de la vista llamante, sino que son subvista de la ventana de aplicaciones y son conservadas por la ventana misma. Generalmente, no retiene una referencia a ellos en el controlador que los llama. En su lugar, evoque la vista modal y luego haga que se comunique con el controlador definiendo el controlador como el delegado de la vista modal.

Creo que si usa sintetizar para crear el descriptor de acceso para una propiedad nextController definida con retain, el programa de acceso retendrá cualquier objeto asignado a la propiedad. Simplemente establecer el valor en nil no liberará el objeto a menos que el acceso esté configurado para hacer eso y no creo que lo hagan los autogenerados.

Tendrá que llamar expresamente al release antes de configurarlo a cero.

Si esto no funciona, publique el código para su definición de la propiedad nextController.

+1

Como dije nextController es miembro, no una propiedad: @interface MainScreenViewController: UIViewController { Identificación nextController; } usando "release" en lugar de asignar nextController a "nil" lleva a una excepción: mensaje viewDidDisappear: enviado al objeto liberado. El objeto parece estar liberado; sin embargo, el instrumento de asignación de objetos "creado y aún activo" muestra solo el uso creciente y creciente de la memoria. –

1

No hay ninguna fuga en el código que muestra hasta donde puedo ver. No podría ser una fuga en InstructionsScreen que evitaría su desasignación.

Creo que vale la pena ejecutar el Analizador de Estática para ver si encuentra una fuga.

La fuga en el código de la plantilla de Apple es interesante. Podría ser que hay una filtración. Parece poco probable, pero obviamente no es imposible. Diría que es más probable que sea falso positivo en Instruments, por lo que sugeriría usar el Analizador Estático.

(Es posible que desee generar un informe de error sobre la fuga.)

Cuestiones relacionadas