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];
}
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