Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIViewController did not deallocate itself

I'm working on an app that changes it's rootViewController depending on it's state. To make a switch I use this code:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self createManagedDocumentAndContext];

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString *storyboardId = [userDefaults boolForKey:@"Profile Created"] ? @"User Stats" : @"Profile";

    self.window.rootViewController = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:storyboardId];

    return YES;
}

To switch back I call this method from presented ProfileVC:

- (void)returnOldRootViewController
{
    UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    OLDUserStatsVC *userStatsVC = [storyboard instantiateViewControllerWithIdentifier:@"User Stats"];
    userStatsVC.userProfile = self.userProfile;

    [currentWindow setRootViewController:userStatsVC];

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setBool:YES forKey:@"Profile Created"];

}

THE PROBLEM: rootViewController is changed, but previous one is not deallocated. It stays on the "background" of the app - I can see it when VC changes to another one.

The question is how to release it properly? Thank you very much!

like image 259
Aleksandr Shcherbakov Avatar asked Sep 28 '22 10:09

Aleksandr Shcherbakov


1 Answers

The real problem here is that you are changing the root view controller of the window. Don't do that. You should be setting this once and never again. There should be just one root view controller for the lifetime of the app.

Find another architecture for displaying the correct view controller and switching between them as desired. For example, they might both be children of the root view controller, or one might be a presented view controller in front of the other.

like image 99
matt Avatar answered Oct 20 '22 10:10

matt