当使用仪器 - >活动监视器测试我的应用程序时,通过后退按钮完成转换时,我看到内存使用的差异,并遵循导航控制器与调用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
这就是发生了什么事。我应该用什么来代替pushViewController?此方法必须将用户发送到屏幕保护程序视图控制器,而不管当通知触发时它们当前所处的视图。 – BobbyScon 2012-02-09 20:26:35
@BobbyScon使用'[self presentModalViewController:controller animated:YES];'显示“screensaver”viewController和'[self dismissModalViewControllerAnimated:YES];'关闭它。不过从AppDelegate不起作用。通过'[navController topViewController];' – 2012-02-09 22:19:22
@MatthiasBauch我可以实际将presentModal并入AppDelegate并且它可以工作,但是当调用dismissModal(在屏幕保护程序视图内)时,它会让你放弃你离开的地方而不是回到主屏幕。它确实解决了内存问题,只是不完全是我需要的成品。感谢您的意见,我会保留它为未来的项目标记! – BobbyScon 2012-02-10 16:04:12