如何更改ViewController以避免内存泄漏

时间:2018-02-12 06:12:36

标签: ios swift xcode memory-leaks

我正在制作游戏应用,你可以玩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)

但如果连续播放某些阶段,则会导致内存泄漏。 我该如何避免这个问题?

* UPDATE

此应用的ViewController转换为

A < B < C(gamestage)

我尝试像这样设置ViewControllers

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

但是旧的cVC的deinit并没有奏效。所以我尝试通过此代码删除旧的VC

self.navigationController?.viewControllers.removeLast()

但是self.navigationController?.viewControllers是零。

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

2 个答案:

答案 0 :(得分:2)

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

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

Stage04Controller(data: SomePlayerData)

SomePlayerData可以在舞台上包含玩家位置,击败怪物或宝藏等等。

执行此操作时 - 每次用户更改阶段时,都不应将新视图控制器推送到导航堆栈。相反,你只需要替换它们,所以在游戏的一个时刻 - 只存在一个视图控制器实例。

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

答案 1 :(得分:0)

当您按下新视图控制器时,旧视图控制器不会从导航控制器中删除,也不会被解除分配。

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

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