2012-02-22 25 views
5

Como parte del inicio de mi aplicación, paso por varios controles de vista. Todo funciona, pero los controladores de vista no se lanzan. (viewDidUnload y dealloc nunca se llaman). Antes de cada cambio de estado, descarto cualquier controlador de vista presentado. Ellos son despedidos, y viewWillDisappear se llama para cada controlador de vista:dismissModalViewControllerAnimated no libera el controlador de vista

- (void)stateChange:(NSString *)state { 

// Dismiss any exiting modals/popups 
[self dismissPopup]; 
[self dismissModalViewControllerAnimated: NO];   

if([state isEqualToString:@"StateBoot"]) { 

    CLRemotePrimaryBootViewController * viewControllerBoot = [[CLRemotePrimaryBootViewController alloc]initWithNibName: @"CLRemoteBootView" bundle:nil]; 
    [self presentModalViewController:viewControllerBoot animated:NO]; 
    [viewControllerBoot release]; 
} 

else if([state isEqualToString:@"StateLogin"]) { 

    CLRemotePrimaryAuthViewController *viewControllerAuth = [[CLRemotePrimaryAuthViewController alloc]initWithNibName: @"CLRemoteAuthView" bundle:nil]; 
    [self presentModalViewController:viewControllerAuth animated:NO]; 
    [viewControllerAuth release]; 
} 

else if([state isEqualToString:@"StateMain"]) { 

    [self setSelectedIndex:0]; 
} 

else if([state isEqualToString:@"StateStop"]) { 

    // TBD 
} 

}

Después de la salida, self.presentedViewController es de hecho nulo. ¿Alguna idea sobre cómo puedo obligar a iOS a liberar estos controles de vista no utilizados?

EDITAR -

SOLVED! Espero que esta publicación ayude a otros. Estaba desconcertado. Resulta que mis controladores de vista modal se derivaron de una clase base que configuraba observadores (NSNotificationCenter) en el método init. Estos observadores deben eliminarse antes de que se pueda liberar el controlador de vista de observación. En mi caso, esto se hizo más difícil porque los observadores eran bloques en lugar de selectores. Al añadir estos observadores, y la identificación se devuelve para cada uno - y así que tuve que realizar un seguimiento de éstos en un NSMutableArray y añadir un método para liberar los observadores en mi clase base:

+ (void) safeUnsubscribe:(id)object { 

if (object != nil) { 

    if ([object isKindOfClass:[CLRemotePrimaryBaseViewController class]]) { 

     CLRemotePrimaryBaseViewController* viewController = (CLRemotePrimaryBaseViewController*)object; 
     [viewController unsubscribe]; 
    }   
} 

} `

`- (void) manija: (NSString *) nombre usingBlock: (CLObjBlock) {bloque

id observer = [[NSNotificationCenter defaultCenter] addObserverForName:name object:nil queue:nil usingBlock:^(NSNotification * notification){ block([notification object]); }]; 
[self.observers addObject:observer];  

}`

// Must call before dealloc or listener will never be released!

`- (void) {darse de baja

for (id observer in self.observers) { 

    [[NSNotificationCenter defaultCenter] removeObserver:observer]; 
} 

[self.observers removeAllObjects]; 

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

}

+0

que usted debe fijar el punto de referencia como una respuesta a tu propia pregunta y luego acéptala. No estaba claro para mí que encontraste una solución hasta que repasabas tu pregunta. – kevlar

Respuesta

1

¡RESUELTO! Espero que esta publicación ayude a otros. Estaba desconcertado. Resulta que mis controladores de vista modal se derivaron de una clase base que configuraba observadores (NSNotificationCenter) en el método init. Estos observadores deben eliminarse antes de que se pueda liberar el controlador de vista de observación. En mi caso, esto se hizo más difícil porque los observadores eran bloques en lugar de selectores. Al añadir estos observadores, y la identificación se devuelve para cada uno - y así que tuve que realizar un seguimiento de éstos en un NSMutableArray y añadir un método para liberar los observadores en mi clase base:

+ (void) safeUnsubscribe:(id)object { 

if (object != nil) { 
    if ([object isKindOfClass:[CLRemotePrimaryBaseViewController class]]) { 

     CLRemotePrimaryBaseViewController* viewController = (CLRemotePrimaryBaseViewController*)object; 
     [viewController unsubscribe]; 
    }   
} 

} 



- (void)handle:(NSString *)name usingBlock:(CLObjBlock)block { 

id observer = [[NSNotificationCenter defaultCenter] addObserverForName:name object:nil queue:nil usingBlock:^(NSNotification * notification){ block([notification object]); }]; 
[self.observers addObject:observer];  

} 


// Must call before dealloc or listener will never be released! 

- (void)unsubscribe { 

for (id observer in self.observers) { 

    [[NSNotificationCenter defaultCenter] removeObserver:observer]; 
} 

[self.observers removeAllObjects]; 

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

} 
0

Dentro de sus controladores de vista son objetos que no han sido liberados. Defina el método dealloc para cada controlador de vista (recuerde llamar a [super dealloc]) y coloque un punto de interrupción para determinar si se está llamando.

Mire a través de cada controlador de vista por cualquier objeto que haya sido asignado y asegúrese de que se haya liberado.

Cuestiones relacionadas