导航控制器中的后退按钮与pushViewController没有什么关系?

时间:2012-02-09 20:17:45

标签: ios xcode uinavigationcontroller pushviewcontroller

使用Instruments测试我的应用时 - >活动监视器,当通过后退按钮完成转换并跟随导航控制器与调用使用pushViewController的AppDelegate中的方法时,我看到内存使用的差异。如果通过导航后退按钮完成导航,则内存使用会下降(我是iOS编程新手,但我相信这个术语是它正在发布该特定控制器的子视图)。如果我使用AppDelegate中使用pushViewController的方法离开该视图控制器,那么内存不会被释放,如果你回到那个视图控制器,它会再次开始相加。我正在为iOS5编写XCode 4.2。

这是AppDelegate中的方法:

-(void)applicationDidTimeout:(NSNotification *) notif
{
    UIViewController *controller = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"slideShow"];

    [[UIScreen mainScreen] setBrightness:0.0];
        NSLog(@"go home");
        [(UINavigationController *)self.window.rootViewController pushViewController:controller animated:YES];
}

应用程序流程如下:带4个按钮的主页面。按钮1使用具有子视图(A)的scrollview推送UIViewController。该子视图还有一个带有关闭按钮的子视图(B)。点击关闭按钮,从超级视图中删除子视图(B)。点击左上角的后退按钮,返回主页面。如果在一段时间后没有用户交互,则上面的方法将触发并发送给screenSaverViewController。触摸屏幕保护程序中的任意位置,然后返回主页面。

观看活动监视器时,每次出现子视图(B)时,“实内存使用情况”窗口中报告的内存量会增加,但在您点击后退按钮并返回主页面之前不会下降。如果屏幕保护程序启动,那么它根本不会停止。

使用任一方法,viewWillDisappear和viewDidDisappear都会在scrollview Controller中触发。为什么一个释放内存而另一个不释放?

我的所有导航都有效,这只是我需要帮助的内存使用问题。

跟进:

picciano指出了我没有看到的东西 - pushViewController做了它的功能。在现有视图之上推送视图。任何人都可以建议正确替换pushViewController?该方法必须从AppDelegate触发,以便应用程序在通知触发时从任何视图导航到屏幕保护程序。

解决:

我最终做的是将导航从AppDelegate移动到各个视图控制器。我确保#import "Timer.h"并将我的通知监听器添加到viewDidLoad [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidTimeout:) name:kApplicationDidTimeoutNotification object:nil];,然后添加了applicationDidTimeout:方法:

-(void)applicationDidTimeout:(NSNotification *) notif
{
    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
}

1,在这种情况下,是我的屏幕保护程序控制器。 0 =根视图。这些数字跟随导航堆栈。 root view (0) -> screen saver (1) -> main page (2) -> 1 of 4 other pages

2 个答案:

答案 0 :(得分:2)

pushViewController(顾名思义)将UIViewController的新实例添加到导航控制器中,增加了整体内存使用量。

相反,后退按钮会从导航控制器中删除顶部UIViewController并释放内存。

如果在视图控制器之后继续推动视图控制器,最终将耗尽内存并崩溃。

重新考虑导航。

答案 1 :(得分:0)

另一个可能的解决方案是查看一些用于添加,删除或交换子视图的UIView方法。

在考虑导航时,有时优质的老式纸和铅笔素描对您的导航模型有用。