2010-12-20 13 views
7

Tengo un controlador de vista basado en la navegación y en el controlador de vista he ocultado la barra de navegación superior y uso una UIView personalizada como la barra de navegación.UIViewController & UIview dealloc no se llama

La barra de UIView tiene un botón Atrás y yo uso los métodos de delegado (he declarado un protocolo) para comunicarme con el controlador de vista cuando se presiona el botón Atrás.

Yo uso delegado en mi CustomNavigation Bar id delegado;

y en los principales Vista Controlador cuando se asigno la barra de navegación que establece el delegado

topBar = [[TopNavigationBar alloc] initWithFrame:CGRectMake(0, 0, 480, 40)]; 
topBar.lblTitle.text = @"Shop"; 
topBar.delegate = self; 

libero este Bar en dealloc ViewControllers.

Ahora, cuando presiono el botón Atrás, uso el método de delegado para llamar a un controlador de vista pop en ViewController principal.

//in Custom Bar 
-(void)ButtonPressed { 
    [delegate TopNavigationBarBackButtonPressed]; 
} 

//In View COntroller 
-(void)TopNavigationBarBackButtonPressed { 

    [self.navigationController popViewControllerAnimated:YES]; 
} 

Ahora el ViewController se poped y el control pasa a la anterior pero el viewController dealloc no se dispara tanto en el ViewController y la UIView

¿Qué estoy haciendo mal?

+0

cualquier gente idea ?? No se llamará a un dealloc si el valor de retención no es 0. Pero no estoy reteniendo viewController en ninguna parte. Hago una [versión de control de vew] después de empujarlo en la pila. Entonces, la única razón por la que puedo pensar es en el protocolo personalizado que he escrito. ¿Tengo que liberarlo? Retengo al delegado en la propiedad. Pero incluso si lo lanzo en el dealloc, no se llamará. ¡¡¡ATACADO !!! –

Respuesta

16

OK! Finalmente comprendió cuál era el problema.

Sí, era el delegado. Entonces, en mi método de "presionar botón atrás", tengo que configurar el delegado en NIL.

-(void)TopNavigationBarBackButtonPressed { 

topBar.delegate = nil; 
[self.navigationController popViewControllerAnimated:YES]; 
} 

Y listo, se llamará a todos los dealloc. Maldito tu protocolo personalizado. 2 días de mi vida, nunca volveré.

EDITAR: OK no es necesario configurar el delegado en cero.

Estaba teniendo todos los problemas porque en la propiedad estaba reteniendo al delegado.

@property(nonatomic, retain)id <ASNavigationDelegate>delegate; 

Ésta debe ser

@property(assign)id <ASNavigationDelegate> delegate; 
+1

Tenía un montón de vistas que no se estaban liberando debido a esto, un código incorrecto que escribí copiado muchas veces, ¡gracias por esto! – Slee

+0

anulando retener/liberar y mirando la pila de llamadas también puede ser útil para estas situaciones. – markshiz

Cuestiones relacionadas