2012-02-22 12 views
5

W ramach mojej uruchamiania aplikacji przechodzę przez kilka kontrolerów widoku. Wszystko działa, ale kontrolery widoku nie są zwolnione. (viewDidUnload i dealloc nigdy nie są wywoływane). Przed każdą zmianą stanu odrzucam wszelkie przedstawione kontrolery widoku. Są one oddalone, a viewWillDisappear nazywany jest dla każdego kontrolera widoku:dismissModalViewControllerAnimated nie zwalnia kontroler widoku

- (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 
} 

}

Po odwołaniu, self.presentedViewController jest w rzeczywistości zero. Jakieś pomysły na to, jak zmusić iOS do wydania tych nieużywanych kontrolerów widoku?

EDYTOWANIE -

SOLVED! Mam nadzieję, że ten post pomaga innym - byłem zaskoczony. Okazuje się, że moje kontrolery widoku modalnego zostały wyprowadzone z klasy bazowej, która ustawiła obserwatory (NSNotificationCenter) w metodzie init. Obserwatorzy muszą zostać usunięci przed zwolnieniem kontrolera obserwacji. W moim przypadku było to trudniejsze, ponieważ obserwatorzy byli blokami zamiast selektorów. Po dodaniu tych obserwatorów, a id jest zwracana dla każdego z nich - a więc musiałem śledzić te w NSMutableArray i dodać metodę, aby zwolnić obserwatorów w klasie bazowej:

+ (void) safeUnsubscribe:(id)object { 

if (object != nil) { 

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

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

} `

`- (void) uchwyt (NSString *) Nazwa usingBlock: (CLObjBlock) blok {

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) {wypisać

for (id observer in self.observers) { 

    [[NSNotificationCenter defaultCenter] removeObserver:observer]; 
} 

[self.observers removeAllObjects]; 

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

}

+0

Powinieneś pisać poprawkę jako odpowiedź na własne pytanie, a następnie zaakceptuj to. Nie było dla mnie jasne, że znalazłeś poprawkę, dopóki nie przejdziesz przez twoje pytanie. – kevlar

Odpowiedz

1

SOLVED! Mam nadzieję, że ten post pomaga innym - byłem zaskoczony. Okazuje się, że moje kontrolery widoku modalnego zostały wyprowadzone z klasy bazowej, która ustawiła obserwatory (NSNotificationCenter) w metodzie init. Obserwatorzy muszą zostać usunięci przed zwolnieniem kontrolera obserwacji. W moim przypadku było to trudniejsze, ponieważ obserwatorzy byli blokami zamiast selektorów. Po dodaniu tych obserwatorów, a id jest zwracana dla każdego z nich - a więc musiałem śledzić te w NSMutableArray i dodać metodę, aby zwolnić obserwatorów w klasie bazowej:

+ (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

wewnątrz widok kontrolerów są obiekty, które nie zostały zwolnione. Zdefiniuj metodę dealloc dla każdego kontrolera widoku (pamiętaj, aby wywołać [super dealok]] i ustaw punkt przerwania, aby określić, czy jest wywoływany.

Przejrzyj każdy kontroler widoku dla dowolnego obiektu, który został przydzielony i upewnij się, że został zwolniony.

Powiązane problemy