在UINavigationController中释放ViewControllers的内存

我正在使用UINavigationController构build应用程序。 我有一个ViewController显示一些内容,当它从用户接收交互(例如点击一个button)时,显示一个新的ViewController

这里是代码:

FirstViewController.m

 -(IBAction)goToSecondVC:(id)sender{ SecondViewController *secondVC = [[SecondViewController alloc] init]; [self.navigationController pushViewController: secondVC]; } 

一旦SecondViewController出现,我想从内存中释放FirstViewController 。 然后,例如,如果我从SecondViewController跳转到FifthViewController我也希望SecondViewController被释放。 当我在控制器之间来回跳转时,应用程序消耗的内存会增加,这意味着它们不会被释放。 有什么想法吗?

当我在控制器之间切换时,内存指示器会发生这种情况。 ARC被激活: 在这里输入图像说明

以前的答案是正确的,你应该避免这样的逻辑。

但是这样做有一个窍门。 你可以在你的navigationController上设置-setViewControllers,然后粘贴那些你想要保留在堆栈中的vc。

例如。 释放FirstViewController,你可以调用Second(在viewDidAppear for ex。)

 NSArray *viewControllers = @[self]; self.navigationController.viewControllers = viewControllers; 

不,你不想释放这些视图控制器。 他们是导航堆栈的一部分,并保留在内存中,以便可以快速导航回到。 如果您的应用程序使用的内存太多,则需要查找其他位置以消耗更less的内存,或者需要使用导航控制器以外的其他位置。

你不能这样做。 由于导航控制器在按下时会保持所有视图控制器。 当你尝试popup时,它会释放它。 在尝试手动释放它之前。 它会崩溃。 如果在导航方式中正常增加内存,请使用instrument找出泄漏并修复。

UINavigationController使用栈数据结构来pipe理viewControllers ,所以你有2个操作: PopPushfirstVC –push-> secondVC –push-> thirdVC 。 现在第一,第二和第三将留在记忆中,以便更快地爆发。 如果你认为这消耗了大量的内存,比你可以为你的viewController使用其他的演示文稿,例如模式地呈现它,或者将它作为一个chiled viewController添加,然后手动删除它,但是使用UINavigationController ,只有popup操作将确保viewController将被释放(如果没有其他强引用的话)。