【问题标题】:Is there a way to check if too many VC are stacked有没有办法检查是否堆叠了太多 VC
【发布时间】:2015-10-28 09:31:29
【问题描述】:

我想知道是否有办法检查我的应用中是否堆叠了太多视图。

我的应用设计是:

导航控制器 -> 表格视图(表格视图像根 VC 一样工作)

从表格视图中,我可以将菜单 VC 作为模态转场打开,并在那里形成我可以将登录 VC 作为模态转场打开,如果我登录,我最终会进入帐户页面,例如:

导航控制器 -> 表格视图 -> 菜单 -> 登录 -> 帐户页面

从帐户页面我可以更深入:

导航控制器 -> 表格视图 -> 菜单 -> 登录 -> 帐户页面 -> 列表设置页面 -> 编辑设置页面

如果算上导航控制器,现在我堆叠了 7 个 VC,即使其中两个显示为模态 VC。

我的应用程序没有崩溃,但这是一个好方法吗?如果我理解正确的应用程序现在必须在 ipad 上运行分屏时共享 CPU,所以我不确定这种方式是否会占用太多内存。

或者我应该简单地将帐户 VC 变成新的根 VC 并重置堆栈?当返回表视图时,再次将其设置为新的根 VC。

【问题讨论】:

    标签: ios xcode swift performance uiviewcontroller


    【解决方案1】:

    视图控制器是轻量级的对象。如果您关心的是内存,您应该对内存警告做出反应。例如。在视图控制器的didReceiveMemoryWarning 方法中。如果 VC 不可见,您可以释放任何缓存的图像,删除视图。在viewDidDisappear 中并不总是需要释放缓存的对象和图像,因为用户可能会返回屏幕,并且如果没有内存问题,您希望避免重新加载所有内容。 didReceiveMemoryWarning 是帮助系统在不牺牲用户体验的情况下释放内存的正确位置。

    您当然可以通过检查UINavigationController 的属性viewControllers.count 来检查导航控制器堆栈上有多少视图控制器。

    将堆栈重置为始终只有一个根视图控制器很好,但通常相当复杂。在导航控制器内部也不太可能。

    您应该使用 Instruments 来检查您的内存消耗并验证您对内存警告的正确反应。内存警告可以在模拟器中手动触发。

    【讨论】:

    • 感谢您的回答,有更多内容可供阅读:)
    【解决方案2】:

    因此,当视图堆叠在导航控制器上时,即使它们不在屏幕上,它们也不会从内存中完全释放。堆叠视图的最大数量没有严格限制,但您应该对此保持谨慎。

    如果您担心 RAM 使用情况,请务必充分利用 viewWillAppearviewWillDisappear 的潜力,执行清理操作,例如取消手势识别器和观察器,并停止任何可能在后台运行的侦听器线。这将减少您的视图在离屏时使用的内存量;无论如何都是很好的编码习惯。

    希望这会有所帮助。

    编辑:Felix 还提出了一个关于内存警告的好观点,如果 iOS 担心您的应用程序的内存使用情况,它会发出内存警告,您可以按照 felix 解释的方式做出反应。

    【讨论】:

      猜你喜欢
      • 2020-11-25
      • 2014-12-22
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多