Swift - 在 segue 之后释放前一个视图控制器

Posted

技术标签:

【中文标题】Swift - 在 segue 之后释放前一个视图控制器【英文标题】:Swift - Deallocate previous view controller after segue 【发布时间】:2016-07-08 06:24:00 【问题描述】:

我正在尝试找到一种适当的方法来处理我的游戏中的场景/视图流程。我目前能够从主菜单切换到游戏关卡,退出游戏关卡并返回主菜单,但它不会从任何视图中释放任何内存。

我看到很多建议使用UINavigationController 来处理我的视图控制器。尝试了一段时间后,我当前的故事板如下所示:

我的根视图控制器是菜单视图控制器。我首先从 Title View Controller 开始,然后转到 Menu View Controller,然后转到 Game View Controller,但这显然不会释放我的任何内存。

我的转场是在 SKScenes 中使用以下方法完成的:

self.viewController?.performSegueWithIdentifier("segueName", sender: viewController)

其中 viewController 是 SKScene 中引用其父视图控制器的 var。

有什么办法可以让我的流程顺利进行吗?我只是希望能够遍历标题场景以进行登录和服务器连接,然后将剩下的时间花在菜单场景和某种游戏场景之间切换。

我尝试了一些建议,例如dismissViewControllerAnimated(true, completion: nil),但它们似乎都没有真正释放任何东西。仅在菜单场景和游戏场景之间循环 2-3 次后,游戏就会变慢。

我已经看到很多类似的问题,但到目前为止我一直无法提出适合我的解决方案。我正在用 Swift 和 Xcode 7.3.1 编写游戏。

【问题讨论】:

检查是否创建了保留周期 【参考方案1】:

我解决了我的问题。我最终得到了一堆对各种事物的强烈引用,比如我的视图、场景和视图控制器。我总共有大约 200 个强引用,所以我有很多清理工作要做。

为了找到我的强大参考,我在此处遵循了有关如何在 Xcode 中使用分配工具的指南:https://www.raywenderlich.com/97886/instruments-tutorial-with-swift-getting-started

任何有同样问题的人,看看这个问题:In swift, how to get memory back to normal after an SKScene is removed?

这就是帮助我解决问题的原因。

【讨论】:

【参考方案2】:

因此,您已经研究了许多不同的方法,但大多数都不适合您和/或应用不正确。

您的应用中现在有一个未使用的导航控制器。一般来说,我会使用导航控制器,但它应该被标记为初始视图控制器,并且您当前的初始视图控制器应该是导航控制器根视图控制器。

一旦你有了它,你需要研究展开的segues(或使用一些代码)。目前你只是总是显示新的视图控制器实例,你永远不会回去。这就是你开始遇到问题的原因。您需要从游戏场景放松到菜单,而不是显示新菜单。

这也可以通过告诉导航控制器将顶视图控制器从其堆栈中弹出来使用代码来完成。

【讨论】:

嗯。我曾考虑过这一点,但当时听起来并不正确,但现在我查看了我的流程,一个简单的游戏视图控制器的推送/弹出应该适合我。我将尝试实现它,看看我能得到什么。 也许我没有正确使用它,但是从 gameViewController 中调用 self.navigationController?.popViewControllerAnimated(false) 并没有删除游戏视图或转换到 menuViewController。什么也没发生。

以上是关于Swift - 在 segue 之后释放前一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 Segue 之后失去@IBOutlets

Swift UI集合视图 - 如何在Cell中显示“segued”用户输入?

故事板中的 Segues 问题

如何在 Swift 中使用警报视图解除 segue?

不能在代码中调用 segue (Swift)

使用 Segue 在 Swift 中将带有数据的对象从一个视图传递到另一个视图