【发布时间】:2012-02-09 20:17:44
【问题描述】:
在使用 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 推送带有滚动视图的 UIViewController,该滚动视图具有子视图 (A)。该子视图还有一个带有关闭按钮的子视图 (B)。点击关闭按钮,子视图(B)将从超级视图中删除。点击左上角的后退按钮,返回主页。如果您在一段时间后没有用户交互,上述方法将触发并将您发送到 screenSaverViewController。触摸屏幕保护程序中的任意位置,即可返回主页。
查看活动监视器时,每次出现子视图(B)时,Real Memory Usage 窗口中报告的已使用内存量都会增加,但在您点击后退按钮并返回主页之前不会下降.如果屏幕保护程序启动,那么它根本不会关闭。
使用任一方法,viewWillDisappear 和 viewDidDisappear 都会在滚动视图控制器中触发。为什么一个释放内存而另一个不释放?
我的所有导航都正常工作,只是内存使用问题需要帮助。
跟进:
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
【问题讨论】:
标签: ios xcode uinavigationcontroller pushviewcontroller