UIViewController не получает dealloc или viewDidUnload при отклонении - PullRequest
0 голосов
/ 10 февраля 2012

ОБНОВЛЕНИЕ: я сделал ошибку в своей отладке - этот вопрос не является релевантным - см. Комментарий ниже.

Примечание.

Когда мое приложение запускается - я представляю контроллер вида внутри UINavigationController с presentViewController:animated:completion.Этот контроллер представления загружает второй контроллер представления в стек навигации.Второй контроллер вида использует [self.presentingViewController dismissViewControllerAnimated:YES completion:nil], чтобы отклонить себя.Моя проблема в том, что ни dealloc, ни viewDidUnload никогда не вызываются в первом контроллере представления.Однако, с инструментами, я вижу, что контроллер представления больше не выделяется, как только представленные контроллеры представления отклоняются.Код, который представляет первый контроллер вида:

- (void)viewDidAppear:(BOOL)animated                                                                                                                                                                                                         
{                                                                                                                                                                                                                                            
    [super viewDidAppear:animated];                                                                                                                                                                                                          

    //  check if our context has any accounts                                                                                                                                                                                                
    if( [self.accounts count] == 0 )                                                                                                                                                                                    
    {                                                                                                                                                                                                                                        
        //  Display the Add Account View Controller                                                                                                                                                                                          
        MySettingsViewController *settingsVC = [[MySettingsViewController alloc] initWithNibName:@"MySettingsViewController" bundle:nil];                                                                                                 
        settingsVC.appContext = self.appContext;                                                                                                                                                                                             

        UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:settingsVC];                                                                                                                              
        navVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;                                                                                                                                                                    

        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)                                                                                                                                                      
        {                                                                                                                                                                                                                                    
            //  Display the Add Account View Controller                                                                                                                                                                                      
        }                                                                                                                                                                                                                                    
        else                                                                                                                                                                                                                                 
        {                                                                                                                                                                                                                                    
            navVC.modalPresentationStyle = UIModalPresentationFormSheet;                                                                                                                                                                     
        }                                                                                                                                                                                                                                    

       [self presentViewController:navVC animated:YES completion:nil];                                                                                                                                                                       
    }                                                                                                                                                                                                                                        
}            

Итак, у меня нет ссылок на settingsVC, которые должны остаться, но я не знаю, почему не вызывается мой dealloc.Любая помощь будет великолепна.

1 Ответ

0 голосов
/ 10 февраля 2012

Они не вызываются, потому что вы не правильно выпустили свой контроллер представления.

Вы выделяете settingsVC и navVC с alloc и, таким образом, получаете собственные ссылки на оба, которые вы должныболее поздняя версия, которую вы не делали.

Вы можете сделать это так:

- (void)viewDidAppear:(BOOL)animated                                                                                                                                                                                                         
{                                                                                                                                                                                                                                            
    [super viewDidAppear:animated];                                                                                                                                                                                                          

    //  check if our context has any accounts                                                                                                                                                                                                
    if( [self.accounts count] == 0 )                                                                                                                                                                                    
    {                                                                                                                                                                                                                                        
        //  Display the Add Account View Controller                                                                                                                                                                                          
        MySettingsViewController *settingsVC = [[MySettingsViewController alloc] initWithNibName:@"MySettingsViewController" bundle:nil];                                                                                                 
        settingsVC.appContext = self.appContext;                                                                                                                                                                                             

        UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:settingsVC];
        navVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;                                                                                                                                                                    

        // At this points, "settingsVC" is additionally retained by the navigation controller,
        // so we can release it now.
        [settingsVC release];

        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)                                                                                                                                                      
        {                                                                                                                                                                                                                                    
            //  Display the Add Account View Controller                                                                                                                                                                                      
        }                                                                                                                                                                                                                                    
        else                                                                                                                                                                                                                                 
        {                                                                                                                                                                                                                                    
            navVC.modalPresentationStyle = UIModalPresentationFormSheet;                                                                                                                                                                     
        }                                                                                                                                                                                                                                    

        [self presentViewController:navVC animated:YES completion:nil];

        // At this point "navVC" is retained by UIKit, so we can release it as well.
        [navVC release];
    }                                                                                                                                                                                                                                        
}           

Альтернативой было бы autorelease сразу.

...