我正在制作游戏应用,你可以玩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被称为。 我该如何解决这个问题?
答案 0 :(得分:2)
@bao,如果你需要玩家能够进入前一阶段 - 在这种情况下正确的方法 - 保存传递的关卡数据而不是保存每个UIViewController。
然后你可以根据需要分配UIViewControllers,例如:
Stage04Controller(data: SomePlayerData)
SomePlayerData可以在舞台上包含玩家位置,击败怪物或宝藏等等。
执行此操作时 - 每次用户更改阶段时,都不应将新视图控制器推送到导航堆栈。相反,你只需要替换它们,所以在游戏的一个时刻 - 只存在一个视图控制器实例。
self.navigationController?.setViewControllers([stageViewController], animated: true)
答案 1 :(得分:0)
当您按下新视图控制器时,旧视图控制器不会从导航控制器中删除,也不会被解除分配。
您需要用新的视图控制器替换旧的视图控制器:
self.navigationController?.setViewControllers([stageViewController!], animated: true)