导航控制器堆栈

Posted

技术标签:

【中文标题】导航控制器堆栈【英文标题】:NavigationController Stack 【发布时间】:2011-01-28 19:38:44 【问题描述】:

首先,对不起我的英语不好。我将尝试解释我的问题:

我有一个 RootViewController(基于导航的项目)。因此,它显示了 tableview,当用户选择表的一行时 (didSelectRowAtIndexPath) y 执行以下操作以显示下一个视图:

NextViewController *nextView = [[NextViewController alloc] initWithNibName:@"NextViewController" bundle:nil];
[self.navigationController pushViewController:nextView animated:YES];
[nextView release];

如果用户选择导航栏的后退按钮并再次选择行,并重复执行此操作,会发生什么情况?正在创建大量新视图(NextViewController 的实例)(大量内存分配)?还是他只是在堆栈中导航?

你能帮帮我吗?我不想以这种方式浪费内存(如果是这样的话)。 谢谢!

【问题讨论】:

【参考方案1】:

如果用户反复从您的 RootViewController 切换到 NextViewController,会发生以下情况:

    NextViewController 在您的didSelectRowAtIndexPath: 方法中创建(alloc'd)。因为您在其上调用了init 方法,所以您有责任释放它。 您将nextView 推送到导航控制器堆栈上,它会保留它。 你释放了nextView,所以唯一有保留的就是导航控制器。 一旦您的用户从 NextViewController 移回,导航控制器就会释放它。现在没有任何东西保留nextView,所以它得到dealloc'd。内存被释放。

基本上,每次用户来回移动时,您都会创建一个 NextViewController(您不是“只是在堆栈中导航”,因为对象每次都在变化),但您并没有泄漏大量内存或保留您创建的每个控制器。您的内存使用情况很好。

【讨论】:

以上是关于导航控制器堆栈的主要内容,如果未能解决你的问题,请参考以下文章

导航控制器堆栈

使用 overCurrentContext 呈现视图控制器,然后推送到导航堆栈会导致导航栏重叠

如果导航堆栈中不存在视图控制器,则推送它

从导航堆栈中删除视图控制器

如何在不使用导航栏的情况下从导航堆栈中弹出控制器

内存警告后的导航控制器堆栈问题