7
votes

When the user clicks a button it presents a new tab bar view controller with two view controllers. Here's how I do that

ACLevelDownloadController *dvc = [[ACLevelDownloadController alloc] initWithNibName:@"ACLevelDownloadController" bundle:[NSBundle mainBundle]];
ACInstalledLevelsController *ivc = [[ACInstalledLevelsController alloc] initWithNibName:@"ACInstalledLevelsController" bundle:[NSBundle mainBundle]];
UITabBarController *control = [[UITabBarController alloc] init];
control.viewControllers = @[dvc, ivc];
dvc.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:0];
ivc.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemDownloads tag:1];
[self presentViewController:control animated:YES completion:nil];

this works fine. I dismiss that view controller with a dismiss method in both the ACLevelDownloadController and ACInstalledLevelsController. That also works fine. What's strange is that the memory usage goes up when I present the view controller enter image description here

but it never goes back down. If I present it again, it goes up even more enter image description here I'm using ARC. Why is the memory that the view controllers use not being released after they are dismissed?

EDIT

The way they are dismissed is both ACLevelDownloadController and ACInstalledLevelsController have IBActions hooked up that call this method when they are clicked

- (void)dismiss:(id)sender{
    [self dismissViewControllerAnimated:YES completion:nil];
}
1
can you provide the code you use for dismissing?Gabriele Petronella
@GabrielePetronella check my editChris Loonam
can you try to call the dismiss... method on self.presentingViewController instead that on self?Gabriele Petronella
Are you using blocks in some part of ACLevelDownloadController or ACInstalledLevelsController? If so, could you provide us the code for those blocks?lucaslt89
There are no blocks in eitherChris Loonam

1 Answers

3
votes

What we can observe from the memory usage graph is that the tabViewController is not being dismissed properly and it builds up in the stack. While dismissing you have to allow the viewController which presented the tabViewController to dismiss it. It is its responsibility to dismiss. Also keep weak references for Outlets and assign any strong references to nil** in viewWillDisapper: . You can present a viewController modally as a temporary interruption to obtain important information from the user. If its not the case here, you can remove presenting modally. Check this link. Hope this helps :)