【问题标题】:Should a UIViewController be deallocated when it performs a Push SegueUIViewController 在执行 Push Segue 时是否应该被释放
【发布时间】:2023-03-26 19:10:01
【问题描述】:

我有一个 LoginViewController (UIViewController),当满足所有条件并且用户点击 Login 按钮时,会运行一个故事板 segue 来推送 ProfileViewController (UIViewController)。发生这种情况时,我的 LoginViewController 的 dealloc 方法中有一个日志语句,以查看它是否被调用,但令我失望的是,它从未被调用过。我的问题是它是否应该被调用?另外,当我登录时,有时我会收到“收到内存警告”,有时我不会,这让我觉得很奇怪,因为我在两种情况下都采取了完全相同的步骤,但我一次收到内存警告,而另一次却没有.

任何人都可以对此有所启发!

谢谢。

【问题讨论】:

    标签: ios memory-management uiviewcontroller automatic-ref-counting uistoryboardsegue


    【解决方案1】:

    UINavigationController 维护着一堆视图控制器。您从该堆栈上的一个元素开始,LoginViewController。当您推送ProfileViewController 时,您现在在堆栈上有两个元素。 LoginViewController 在从堆栈中移除之前无法释放。

    如果您希望 ProfileViewController 替换导航控制器堆栈上的 LoginViewController,您可以编写自定义 segue 类来实现该行为。 See this Q&A.

    (您可能认为您可以在情节提要中使用“替换”或“显示详细信息(例如替换)”segue 类型,但这些仅在您使用 UISplitViewController 时才有效。)

    【讨论】:

    • 感谢您的回复..我的 ProfileViewController 中也有注销功能。当您单击 Logout 按钮时,您将返回到 LoginViewController,这是通过 UnwindSegue 完成的。如果我将 LoginViewController 替换为 ProfileViewController 而不是将其添加到堆栈中,注销功能是否仍会按预期工作,还是会导致崩溃? @rob 梅奥夫
    • 如果您使用展开转场返回LoginViewController,则需要将LoginViewController 留在堆栈上,并且希望它保持分配状态。听起来你实际上没有问题。
    • 我的应用程序运行良好。但是当我在登录并进入 ProfileViewController 5 秒后看到“收到的内存警告”时,我开始认为我确实有问题@rob mayoff
    • 如果您认为自己有内存问题,请在 Allocations 工具下运行您的应用程序。 (菜单栏 > 产品 > 配置文件开始使用。)
    【解决方案2】:

    启用 ARC 后,当一个对象没有被引用时,它会被释放。

    为了显示来自ProfileViewController 的视图,您在LoginViewController 中实例化它的一个对象,这就是您在显示后仍然可以看到配置文件视图的方式。如果LoginViewController 实例被释放,配置文件视图也将被释放(假设没有其他人引用它)。出于同样的原因,LoginViewController 实例不会被释放,因为另一个对象持有对它的引用。假设您的视图呈现在Window -> ProfileViewController -> ProfileViewController,它是阻止 ProfileViewController 实例被释放的窗口。

    如果到目前为止您有两个视图,那么内存警告应该来自其他地方。两个视图不会导致问题。

    【讨论】:

      猜你喜欢
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 2018-11-27
      相关资源
      最近更新 更多