2011-07-11 21 views
6

Tengo un UIViewController (llámalo NumberTwo) que presenté como controlador de vista modal desde otro UIViewController (llámalo NumberOne). NumberTwo contiene un método touchesBegan que escucha los toques, y también tiene un método de acelerómetro que escucha los cambios de orientación del dispositivo en la dirección x, y o z. NUMBERTWO tiene un botón llamado "Done" que, cuando se le golpea, descarta como un controlador de vista modal:Aplicación para iPhone: descartar el controlador de vista modal no lo trata

[self dismissModalViewControllerAnimated:NO]; 

Pero parece como si todavía está escuchando para toques, y todavía está escuchando para las aceleraciones. ¿Cómo puedo liberar completamente NumberTwo cuando lo descarto? Traté de agregar una llamada de liberación de la siguiente manera:

[self dismissModalViewControllerAnimated:NO]; 
[self release]; 

pero eso causó un EXEC_BAD_ACCESS.

Respuesta

3

¿Ha soltado el controlador después de haberlo presentado? P.ej. en su método en el NumberOneController que lo presenta, ¿tiene algo como:

NumberTwoController * controller = [NumberTwoController alloc] init]; 
// do stuff to config controller 
[self presentModalViewController: controller]; 
[controller release]; 

A menos que quiera aferrarse a NumberTwoController para su reutilización, este sería el patrón habitual. El método presentModalViewController asegura que el controlador se conserva mientras está en uso. Luego, debe organizarse cuando, dentro de NumberTwoController, llame al [self dismissModalViewControllerAnimated: NO].

+0

¿Qué sucede si usa ARC? ¿Cómo destruyes viewController después de despedir? – tybro0103

+0

Si está utilizando ARC, el compilador (en efecto) insertará la [versión del controlador] después de que el controlador se haya presentado de forma modal. No es necesario tomar ninguna medida sobre el despido: iOS se asegurará de que el controlador se libere en estas circunstancias. – Obliquely

1

Asegúrate de estar liberando todo lo que usas cuando termines con él; El método dealloc solo se invoca cuando el UIViewController y todas sus propiedades/objetos ya no se utilizan. Nunca use [self release];, necesita liberarlo del controlador de vista que lo creó después de que haya terminado con él.

3

Tuve un problema muy similar que me atormentó durante días. Resultó que mi clase de controlador de vista no estaba desasignada cuando la descarté porque ese controlador de vista tenía un NSTimer activo que no se invalidaba (se detenía). Pude matar el temporizador en viewDidDisappear.

+1

¿Cómo se enteró? Quiero decir, ¿hay algo en Instruments que te ayude en esta situación o fue solo que volviste a leer tu código? – Pierre

+0

Disculpa la demora en responder, lamentablemente, solo fue volver a leer mi código que lo resolvió. – TPoschel

Cuestiones relacionadas