解散其父视图控制器后,SKScene保留在内存中

时间:2018-08-05 21:50:17

标签: ios swift sprite-kit swift4

在测试我的应用程序时,我意识到转到视图控制器来呈现我的场景并再次返回会增加内存的已用空间。因此,我运行仪器来了解未释放的内容。我发现场景中有一些实例占用了空间。我该如何解决?

我的场景类中有一个属性可以访问其视图控制器(我将其定义为弱以避免保持周期) 我的场景课中有关的几行是:

weak var viewController: MyViewControllerClass?
func exitFunction () {
viewController.dismiss(animated: true , completion: nil)
self.view!.presentScene(nil)
}

1 个答案:

答案 0 :(得分:0)

所有场景都应属于同一视图控制器,也就是说,在Sprite Kit游戏中,只有一个视图控制器。

您应该定义场景和SKView以便将它们显示在此视图控制器中,如下所示:

class GameViewController: UIViewController {
    var skView: SKView?
    var mainMenu: MainMenu?

    override func viewDidLoad() {
        super.viewDidLoad()
        skView = self.view as! SKView?
    }

在场景内部,请确保正确分配资源:

override func willMove(from view: SKView) {
    removeAllChildren()
}

deinit {
    //Deallocate your resources here
}

每次从场景移到另一个场景时都会调用WillMove。

最后,当您从viewController类内部显示场景时,请确保首先取消分配旧场景:

func showMainMenu(_ notification: Notification) {
    deallocScenes()
    mainMenu = MainMenu(fileNamed: "MainMenu")
    mainMenu?.scaleMode = .fill
    skView!.presentScene(mainMenu)
}

func deallocScenes(){
    mainMenu = nil
    levelSelection = nil
    credits = nil
}