我知道有很多关于这个话题的讨论.但在所有讨论中,所有讨论都与2个视图控制器(A& B)进行了讨论.我的情况类似但不同.
当有多个视图控制器(如A,B,C,D)时会发生什么.所以呈现流程如下:
视图控制器A(主页)显示视图控制器B(列表).然后从View控制器B呈现View Controller C(Details).然后从View Controller C呈现View Controller D(Advanced Details).然后从视图控制器D呈现视图控制器A,以便直接导航到主页!!!
什么是最好的做法???
最佳答案 不知道你的项目结构和你将如何显示A,B,C,D,E,F然后从F回到A的细节,我会猜测并说它可能会导致内存泄漏,具体取决于什么您为UIViewControllers使用的设计模式.正如@CaptJak在您的问题中所评论的那样,很难判断它是否,如何以及何时会导致内存泄漏,特别是如果您使用委托模式在视图控制器周围传递数据.
就个人而言,当我执行复杂的流程,例如呈现多个UIViewControllers并发现自己需要返回几个屏幕时,我不会在堆栈上弹出视图,直到我想要的那个在堆栈顶部(如果你使用导航如果它以模态方式呈现,则取消视图控制器,如果我使用它们,则解除segues.这里的风险可能是视图控制器的内存可能已经解除分配.
我会评论,但我没有足够的声誉.我在iOS开发中仍然非常新鲜,我的回答很简单.
编辑:感谢您提供的应用流程中提供的详细信息.既然你可以使用presentViewController,我假设你在NavigationController上运行?如果是这种情况,我会使用popToViewController或popToRootViewController(如果A是你的根视图控制器),而不是再次从D中呈现A.如果A再次出现在D中,我猜你的VC堆栈中会有2个A实例可能导致内存泄漏.
PopToViewController方法
NSArray arrayOfVCs = self.navigationController.viewControllers;
for(UIViewController *currentVC in arrayOfVCs)
{
if([currentVC isKindOfClass:[ViewControllerA class])
{
[self.navigation.controller popToViewController:currentVC animated:YES]
}
}
PopToRootViewController方法(假设A是导航控制器中的根视图)
[self.navigationController popToRootViewControllerAnimated:YES]
编辑2016年4月12日
我一直在考虑这个问题,以至于我实际上对它做了一个简短的RnD,只是想在这里分享我的发现.我做了一个粗糙的简单和脏的功能,以获得在我非常简单的应用程序中呈现的所有模态视图控制器的堆栈.
我测试了A – > B – > C-> B – > C – > B约20-30倍.每次我去时间B – > C,内存增加0.5MB(因为我的屏幕很简单,但你的屏幕可能不同),最终增加了20 MB到50 MB.
在这个函数中,我记录了堆栈中呈现的视图控制器的数量以及它们在数组中的名称.到目前为止,它对我有用,但你可以尝试一下,看看它是否适合你.
//global variables
var vccount = 0
var vcnamelist = [String]()
func getPresentingViewStackCount(currentVC : UIViewController!){
if(currentVC.presentingViewController != nil){
vccount = vccount + 1
let vc = currentVC.presentingViewController
vcnamelist.append(NSStringFromClass((vc?.classForCoder)!))
getPresentingViewStackCount(vc)
}
}
// to use
func someRandomMethod(){
getPresentingViewStackCount(self)
}
尽管如此仍然认为最好使用导航控制器.这就是它们的基础. 🙂