ios - 整个 View Controller 中的多个 presentViewController 方法调用会导致 iOS 中的内存泄漏吗?

标签 ios memory-leaks uiviewcontroller automatic-ref-counting presentviewcontroller

我知道有很多与此主题相关的讨论。但在所有讨论中都讨论了 2 个 View Controller (A&B)。我的情况相似但不同。

当有多个 View Controller 如 A、B、C、D 时会发生什么。所以呈现流程移动为,

View controller A (Home) 呈现 View controller B(List)。然后从 View controller B 呈现 View Controller C(详细信息)。然后从 View Controller C 呈现 View Controller D(高级详细信息)。然后从 View Controller D 呈现 View Controller A ,以便直接导航到 Home!

最佳实践是什么???

最佳答案

不知道你的项目结构和你将如何显示 A、B、C、D、E、F 然后从 F 回到 A 的细节,我会大胆猜测并说这可能会导致内存泄漏取决于您对 UIViewControllers 使用的设计模式。正如@CaptJak 在你的问题中评论的那样,很难说它是否、如何以及何时会导致内存泄漏,尤其是当你使用委托(delegate)模式在 View Controller 周围传递数据时。

就我个人而言,当我执行复杂的流程(例如呈现多个 UIViewController)并发现自己需要返回几个屏幕时,我不会弹出堆栈中的 View ,直到我想要的 View 位于堆栈顶部(如果您正在使用导航 Controller ),如果以模态方式呈现,则关闭 View Controller ,或者如果我使用它们,则取消 segues。这里的风险可能是 View Controller 的内存可能已被释放。

我会发表评论,但我没有足够的声誉。对我的回答持保留态度,因为我在 iOS 开发方面还很新鲜。

编辑:感谢您在应用流程中提供的详细信息。由于您可以使用 presentViewController,我假设您在 NavigationController 上运行?如果是这种情况,我会在这种情况下使用 popToViewControllerpopToRootViewController(如果 A 是您的 Root View Controller ),而不是再次从 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 是导航 Controller 中的 Root View )

[self.navigationController popToRootViewControllerAnimated:YES]

编辑 2016 年 4 月 12 日

我一直在思考这个问题,以至于我实际上做了一个简短的 RnD,只是想在这里分享我的发现。我做了一个简单粗暴的函数来获取我非常简单的应用程序中曾经出现过的所有模态视图 Controller 的堆栈。

我从 A -> B -> C-> B -> C -> B 测试了大约 20 - 30 次。每次我去时间 B -> C,内存增加 0.5MB(因为我的屏幕很简单,但你的可能不同)并最终从 20+ MB 增加到 50+ MB。

在这个函数中,我记录了堆栈中呈现的 View Controller 的数量以及它们在数组中的名称。到目前为止,它对我有用,但您可以尝试一下,看看它是否适合您。

//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)
}

但仍然认为最好使用导航 Controller 。这就是它们的用途。 :)

关于ios - 整个 View Controller 中的多个 presentViewController 方法调用会导致 iOS 中的内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36330047/

相关文章:

ios - 因 NSException 类型的未捕获异常而终止 Timer Swift 崩溃

go - 如何准确跟踪内存使用情况?

java - 调试内存泄漏 - org.hibernate.engine.StatefulPersistenceContext

ios - 用于关闭由 UIPopoverPresentationController 呈现的 View Controller 的 UI,无论 Size Class 是什么

ios - 如何向作为 UIViewController 子类的parentViewController 发送消息?

ios - 如何刷新 NimbusPhotos 示例应用程序中的图片?

ios - WKWebView 的缓存

ios - CGImageDestinationFinalize 时崩溃

memory-leaks - 为什么 PrivateMemorySize64 返回的值比 GC.GetTotalMemory 更大?

ios - UIPageControl - 单击按钮更改页面