开发者

Should pushViewController release oldController when a new one is pushed?

From what I unde开发者_运维问答rstand pushViewController should release old viewController when a new one is pushed?

Here I just creates two different viewControllers and pushes them.

    UINavigationController *navController = [[UINavigationController alloc] init];
    [self.window addSubview:navController.view];

    smallLayout = [[SmallViewController alloc] init];
    [navController pushViewController:smallLayout animated: NO];
    [smallLayout release];

    largeLayout = [[LargeViewController alloc] init];
    [navController pushViewController:largeLayout animated: NO];
    [largeLayout release];

In the SmallViewController dealloc is never getting called and when I'm checking retain count it's still 1. I'm checking retain count long after the run loop is done and I also know that retain count isn't something you should trust.


No it should not....

The navigation controller maintains a navigation stack of all the view controllers pushed on to it... so when you go back or pop the current view controller, the previous controller is still present.

The navigation controller will release a view controller after it is popped.


The view controllers don't get released when you push a new controller onto the navigation stack. The navigation controller stays holding onto them so that it has the correct item to display when you pop the current controller off of it. If it was releasing it, then the nav controller wouldn't have anything to go back to.

If you're looking to try to optimize memory, implement -(void)viewDidUnload. It gets called when ever the controller's view gets unloaded which may happen when you push the new controller. I say may happen since it is called during low-memory conditions. So if you have plenty of free memory it won't get called. In the simulator you can force it by simulating a memory warning. Make sure that anything you destroy in it can be, and is, recreated in -viewDidLoad.


You alloc once, you release once. You are already doing it in your code. So AFAIK your code is fine. Here dealloc of smallLayout won't get called because UINavigationController keeps a stack of all viewControllers pushed into it, hence retaining it. UINavigationController manages the release of these viewControllers, when it is no longer needed.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜