不知道你的项目结构以及如何显示 A、B、C、D、E、F 然后从 F 回到 A 的详细信息,我会大胆猜测并说这可能会导致内存泄漏,具体取决于什么您在 UIViewController 中采用的设计模式。正如@CaptJak 在您的问题中所评论的那样,很难判断它是否、如何以及何时会导致内存泄漏,特别是如果您使用委托模式在视图控制器周围传递数据。
就我个人而言,当我执行复杂的流程(例如呈现多个 UIViewController)并发现自己需要返回几个屏幕时,我不会将堆栈中的视图弹出,直到我想要的视图位于堆栈顶部(如果您使用导航)控制器),如果以模态方式呈现,则关闭视图控制器,或者如果我使用它们,则展开segues。这里的风险可能是视图控制器的内存可能已被释放。
我本来会发表评论,但我没有足够的声誉。对我的回答持保留态度,因为我对 iOS 开发还很陌生。
编辑:感谢您在应用程序流程中提供的详细信息。既然您可以使用presentViewController,我假设您正在NavigationController 上运行?如果是这样的话,我会使用popToViewController
or 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)
}
但仍然认为最好使用导航控制器。这就是它们的目的。 :)