Вопрос: Устранение неполадок с помощью диспетчера viewModalViewControllerAnimated


В рамках запуска моего приложения я просматриваю несколько контроллеров представлений. Все работает, но диспетчеры представлений не выпущены. (viewDidUnload и dealloc никогда не вызываются). Перед каждым изменением состояния я отклоняю любые представленные контроллеры представлений. Они отклоняются, и viewWillDisappear вызывается для каждого контроллера вида:

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

}

После увольнения self.presentedViewController фактически равен нулю. Любые идеи о том, как я могу заставить iOS освободить эти неиспользуемые контроллеры представлений?

РЕДАКТИРОВАТЬ -

РЕШИТЬ! Надеюсь, что этот пост помогает другим - я был озадачен. Оказывается, мои модальные контроллеры представлений были получены из базового класса, который устанавливал наблюдателей (NSNotificationCenter) в методе init. Эти наблюдатели должны быть удалены до того, как контроллер наблюдения будет выпущен. В моем случае это стало сложнее, потому что наблюдатели были блоками вместо селекторов. При добавлении этих наблюдателей и id возвращается для каждого из них - и поэтому мне пришлось отслеживать их в NSMutableArray и добавлять метод для выпуска наблюдателей в моем базовом классе:

+ (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) отменить подписку {

for ( id observer in self.observers ) {

    [[NSNotificationCenter defaultCenter] removeObserver:observer];
}

[self.observers removeAllObjects];

[[NSNotificationCenter defaultCenter] removeObserver:self];

}


5


источник


Ответы:


РЕШИТЬ! Надеюсь, что этот пост помогает другим - я был озадачен. Оказывается, мои модальные контроллеры представлений были получены из базового класса, который устанавливал наблюдателей (NSNotificationCenter) в методе init. Эти наблюдатели должны быть удалены до того, как контроллер наблюдения будет выпущен. В моем случае это стало сложнее, потому что наблюдатели были блоками вместо селекторов. При добавлении этих наблюдателей и id возвращается для каждого из них - и поэтому мне пришлось отслеживать их в NSMutableArray и добавлять метод для выпуска наблюдателей в моем базовом классе:

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

}

1



Внутри контроллеров просмотра есть объекты, которые не были выпущены. Определите метод dealloc для каждого контроллера представления (не забудьте вызвать [super dealloc]) и поместите контрольную точку, чтобы определить, вызвана ли она.

Просмотрите каждый контроллер представления для любого объекта, который был alloc'd, и убедитесь, что он был выпущен.


0