【问题标题】:How to change ViewController to avoid memory leak如何更改 ViewController 以避免内存泄漏
【发布时间】:2018-07-22 06:29:08
【问题描述】:

我正在制作可以玩 1~30 个关卡的游戏应用。当您进入下一阶段时,我使用此代码

        var stageViewController: StageBaseViewController?

        switch stageNumber {
        case 1:
            stageViewController = Stage02Controller()
        case 2:
            stageViewController = Stage03Controller()
        case 3:
            stageViewController = Stage04Controller()  
        ...          
        case 29:
            stageViewController = Stage30Controller()
        default:
            print("error: unknown stage number.")
        }
        self.navigationController?.pushViewController(stageViewController!, animated: true)

但是如果你连续玩一些阶段,就会导致内存泄漏。 我怎样才能避免这个问题?

*更新

这个应用的ViewController过渡是

A < B < C(gamestage)

我尝试像这样设置 ViewControllers

self.navigationController?.setViewControllers([aVC, bVC, cVC], animated: true)

但是旧的 cVC 的 deinit 不起作用。所以我试图通过这段代码删除旧的 VC

self.navigationController?.viewControllers.removeLast()

但是 self.navigationController?.viewControllers 是 nil。

当我设置 3 个 VC 时,没有调用 deinit,因此增加了内存。 但是只设置了1个VC(cVC),调用了deinit。 我该如何解决这个问题?

【问题讨论】:

    标签: ios swift xcode memory-leaks


    【解决方案1】:

    当您推送新的视图控制器时,旧的视图控制器不会从导航控制器中移除,也不会被释放。

    你需要用新的视图控制器替换旧的视图控制器:

    self.navigationController?.setViewControllers([stageViewController!], animated: true)
    

    【讨论】:

    • 感谢您的回答。我更新了我的代码和新问题,所以请检查一下。
    【解决方案2】:

    @bao,如果你需要你的玩家有能力去之前的阶段 - 在这种情况下正确的方法 - 保存传递的关卡数据而不是保存每个 UIViewController。

    然后您可以根据需要分配 UIViewControllers,例如:

    Stage04Controller(data: SomePlayerData)
    

    其中 SomePlayerData 可以包含玩家在舞台上的位置、击败的怪物或宝物的位置等。

    当您这样做时 - 您不应该在每次用户更改阶段时将新视图控制器推送到导航堆栈。相反,您只需替换它们,因此在游戏的某一时刻 - 只会存在一个视图控制器实例。

    self.navigationController?.setViewControllers([stageViewController], animated: true)
    

    【讨论】:

    • 感谢您的回答。代码运行良好,内存没有增加。但新的麻烦确实出现了。我更新了我的代码,所以请检查一下。
    • @bao,仅在内存中保留最后一个阶段视图控制器。当您的玩家在第三阶段并按下返回按钮时 - 执行 self.navigationController?.setViewControllers([Stage02Controller()], animated: true)
    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2014-08-26
    • 2018-04-08
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多