繁体   English   中英

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

[英]What does the back button in a navigation controller do that pushViewController doesn't?

当使用Instruments - > Activity Monitor测试我的应用程序时,我看到通过后退按钮完成转换并跟随导航控制器与调用AppDelegate中使用pushViewController的方法时内存使用的差异。 如果通过导航后退按钮完成导航,则内存使用会下降(我是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

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

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

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

重新思考你的导航。

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

在考虑导航时,有时候好的旧式纸和铅笔素描对您的导航模型有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM