2012-02-09 31 views
0

当使用仪器 - >活动监视器测试我的应用程序时,通过后退按钮完成转换时,我看到内存使用的差异,并遵循导航控制器与调用AppDelegate中使用pushViewController的方法。如果导航由导航后退按钮完成,那么内存使用会下降(我是iOS编程的新手,但我相信这个术语是它释放了特定控制器的子视图)。如果我使用AppDelegate中使用pushViewController的方法远离该视图控制器,则内存不会被释放,并且如果您返回到该视图控制器,它将再次开始叠加。我正在为iOS5编写XCode 4.2。导航控制器中的后退按钮是否可以实现pushViewController不支持的功能?

这是在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)的滚动视图推送UIViewController。该子视图还有一个子视图(B)和一个关闭按钮。点击关闭按钮并从子视图中删除子视图(B)。点击左上角的后退按钮,返回主页面。如果您在一段时间后没有用户交互,上面的方法会触发并将您发送到screenSaverViewController。触摸屏幕保护程序中的任何位置,然后返回主页面。

在观看活动监视器时,每当子视图(B)出现时,正在使用的实际内存使用情况窗口中报告的内存量增加,但在下一个按钮后才会下降,并返回Main页。如果屏幕保护程序启动,那么它根本不会关闭。

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

我所有的导航工作,这只是一个内存使用问题,我需要帮助。

追问:

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

pushViewController(如名称所示)将UIViewController的新实例添加到导航控制器中,从而增加整体内存使用量。

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

如果在视图控制器之后继续推送视图控制器,则最终会导致内存不足并崩溃。

反思您的导航。

+0

这就是发生了什么事。我应该用什么来代替pushViewController?此方法必须将用户发送到屏幕保护程序视图控制器,而不管当通知触发时它们当前所处的视图。 – BobbyScon 2012-02-09 20:26:35

+1

@BobbyScon使用'[self presentModalViewController:controller animated:YES];'显示“screensaver”viewController和'[self dismissModalViewControllerAnimated:YES];'关闭它。不过从AppDelegate不起作用。通过'[navController topViewController];' – 2012-02-09 22:19:22

+0

@MatthiasBauch我可以实际将presentModal并入AppDelegate并且它可以工作,但是当调用dismissModal(在屏幕保护程序视图内)时,它会让你放弃你离开的地方而不是回到主屏幕。它确实解决了内存问题,只是不完全是我需要的成品。感谢您的意见,我会保留它为未来的项目标记! – BobbyScon 2012-02-10 16:04:12

0

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

在考虑导航时,有时会用好的老式纸和铅笔素描来绘制导航模型。

+0

谢谢!我确实画出了这一个。我相信,我的导航非常准确,它只是屏幕保护程序的调用,它也会让您回到主屏幕,让我绊倒。这款应用程序适用于在博物馆画廊中全天候运行的自助服务终端,因此在经过一段时间没有用户互动之后,我基本上需要应用程序“重置”。刚刚实施了上面的更改,看起来我们很好走!没有更多的内存积聚。再次感谢帖子! – BobbyScon 2012-02-10 16:17:04

相关问题