从内存中分段并清除历史ViewController

我有一个iPad应用程序,它有很多的屏幕和很多segue选项。 目前,我只是使用performSegueWithIdentifier来启动这些赛段,我担心的是当用户执行越来越多的赛段时,我正在占用大量的内存。 我已经看到,人们build议使用函数popToRootViewControllerAnimated:如果使用UINavigationController,但问题是我没有使用一个。 我怎样才能阻止VC的数量激增? 应用程序的工作方式,用户不断回到根VC – 有效的search屏幕。 所以,如果我能够在需要这样一个轮stream的时候清理VC的堆栈,那么我就可以解决我的问题,但我不知道如何去解决这个问题。 感谢您的任何build议。

当你使用segues时,stream程会前后移动。 当用户向后移动(即按“后退”),则不会推到新的VC,而是popup到已经存在的VC。 当你popup时,当前的VC将从堆栈和内存中移除。

如果你在stream程中向后移动,那么这是错误的。 你只需要继续前进。

一个适当的准备SEGUE

在准备segue你不应该创build自己的视图控制器,并推动他们。 故事板在那里为你做这一切。

一个适当的prepareForSegue方法应该看起来像这样…

- (void)prepareForSegue:(UIStoryBoardSegue*)segue { if([segue.identifier isEqualToString:"SomeSegue"]) { MyNewViewController *controller = segue.destinationViewController; controller.someProperty = "some value to pass in"; } } 

这就是你所需要的。 请注意,如果您打算将一些信息传递给新的视图控制器,您只需要这个。 如果你没有向前传递任何东西,那么你根本就不需要这个方法。

当方法结束时,新的VC将被故事板文件推到屏幕上。

UNWIND SEGUES

如果你有一个随机的stream(如你的评论),那么你可以使用unwind segues来实现这一点。

在你'一个'视图控制器有一个function,如…

 - (IBAction)someUnwindAction:(UIStoryboardSegue*)sender { //some action to run when unwinding. } 

它需要收到一个UIStoryboardSegue对象。 如果设置为IBAction,则还可以从Interface Builder访问它。

现在,当你想要去A> B> C> B> A时,只需要使用标准的推送和popup(从继续和后退button)。

当你想要去A> B> C> A的时候,你可以使用控制器C中的退绕顺序。

如果你在控制器C中有一个取消button或者其他的东西,这个在Interface Builder中,这会把你带回到控制器A.然后在控制器C下面的Interface Builder中,你将会看到一个带有门和箭头的绿色方块出来了。 只需将取消button的动作指向该符号,然后select“someUnwindAction”。 (注意,unwindAction在A中,button在C中)XCode然后使用它来popup你一直回到A并处理删除任何内存和东西。 如果你想要的话,你也可以把更多的信息发回给A。

如果你想通过编程方式从C中获得这个展开顺序,那么你可以运行…

 [self performSegueWithIdentifier:"someUnwindAction" sender:nil]; 

这也会回到A.

我没有看到使用segues的任何问题,它比任何其他更简单。 如果您担心内存消耗,那么只需对您的应用程序进行configuration,看看它吃了多less,以及“内存压力处理程序”被调用的频率。

好吧我相信我已经明白了这一点。 它似乎工作。

由于我一直回到一个普通的VC,我正在把代码放在我想要回到这个“根”VC的位置,以清除VC堆栈。

我仍然在我的正常代码中执行实际的segue

 [self performSegueWithIdentifier:@"editBackToSearch" sender:self]; 

然而,在“prepareForSegue:”方法中,我不再创build一个新的VC对象,而是执行任何我未完成的工作(保存我的数据),然后使用以下代码清除VC堆栈。

 UIViewController *vc = self; while ([vc presentingViewController] != NULL) { vc = [vc presentingViewController]; } [vc dismissViewControllerAnimated:NO completion:nil]; 

它看起来运行顺畅,并且具有期望的影响(通过分析器确认)释放这些VC吸入的内存。

最后一条评论 – 由于某种原因,我无法激活解雇命令,这似乎触发了一个无限循环,并产生了一个EXC_BAD_ACCESS。 animation设置为NO,但它工作得很好。

谢谢你的帮助。