【问题标题】:Is the UIViewController calling the method presentViewController removed from the memory?调用方法 presentViewController 的 UIViewController 是否从内存中删除?
【发布时间】:2014-03-25 18:44:12
【问题描述】:

假设我有一个 UIViewController A 和一个 UIViewController B。从 A,我调用方法 presentViewController:B。当B出现时,A会发生什么?它是否从记忆中删除?如果没有,我应该调用什么方法来删除它?

如果我的UI流程是这样的,A->B->A->B->A->B->...等等,如何防止内存增加相应地?

【问题讨论】:

    标签: ios memory-management uiviewcontroller uistoryboard


    【解决方案1】:

    当您使用控制器A 中的presentViewController:animated:completion: 方法以模态方式呈现控制器B 时,会发生ApresentedViewController 属性设置为控制器B,而presentingViewController B 的属性设置为 A。因此,在演示过程中,两个控制器都保存在内存中。

    当您从B 转到A 时,您通过BpresentingViewController 属性在A 上调用dismissViewControllerAnimated:completion:,如下所示:

    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
    

    (您也可以拨打[self dismissViewControllerAnimated:YES completion:nil],系统会自动将请求转发给呈现的视图控制器。)

    之后,ApresentedViewController 属性将被设置为nil,因此,只要没有任何其他强指针指向它,它就会被系统释放内存.

    【讨论】:

    • 如果我有另一个 UIViewController C 会发生什么?所以流程会是这样,A->B->C->A->..当C调用dismissViewController时,出现的不就是B吗?
    • @OscarYuandinata 如果您想从C 转到A,请在A 上致电dismissViewControllerAnimated:completion:。它将删除 A 的呈现视图控制器 (B),以及呈现视图控制器 (C) 堆栈中的任何其他子。
    • 我刚刚读到关于将 UIViewController 分配为 rootViewController 例如。 self.view.window.rootViewController = confirmPictureViewController;哪一种切换UIViewController比较合适?
    • @OscarYuandinata 这取决于。分配给rootViewController 会将视图控制器嵌入导航层次结构中。使用presentViewController:animated:completion: 呈现视图控制器更适合临时屏幕。例如,想象一个想要上传文件的应用程序。当用户按下“上传”时,会以模态方式呈现一个表格视图控制器来询问用户她想要上传哪个文件。检查 HIG:developer.apple.com/library/ios/documentation/userexperience/…
    • rootViewController 是我当时所需要的。无论如何,还有1个问题。与我最初的问题类似,分配 rootViewController 的视图控制器是否已从内存中删除?
    【解决方案2】:

    它不会自动释放。您可以使用dismissModalViewControllerAnimated手动释放它。

    这是一个很好的教程:Link

    【讨论】:

      【解决方案3】:

      不,A 不会从内存中删除。 如果你想在 A 和 B 之间交替,你可以:

      • 使用UINavigationController 并按B,然后再次弹出它,您又回到了A
      • 或将 B 设为窗口的新根控制器,然后再次设为 A 并添加适当的过渡
      • 或使用 a 作为根并呈现 B。然后解散 B,您将返回 A。

      【讨论】:

        【解决方案4】:

        A 完成它的任务时,拥有一个根视图控制器,让您的根视图负责移除 A 并呈现 B。同样,当 B 完成其任务时,会提醒您的根视图删除 B 并再次显示 A

        【讨论】:

          【解决方案5】:

          UIViewController 将保留在内存中,除非您将其弹出。

          使用 push & pop 而不是仅仅推送新的UIViewControllers

          而不是这个A->B->A->B->A->B->

          你会得到这个A<->B

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-30
            • 1970-01-01
            • 1970-01-01
            • 2016-03-20
            • 2011-02-04
            • 1970-01-01
            • 1970-01-01
            • 2017-09-26
            相关资源
            最近更新 更多