由于内存问题而终止-ViewControllers占用内存

时间:2018-12-03 06:52:21

标签: swift sprite-kit

我正在使用Sprite套件开发游戏,并且具有用于不同场景的各种视图控制器。像故事模式,多人游戏等...

我注意到一个问题,每次打开带有SpriteKit场景的视图控制器时,我的应用程序的内存使用量都会增加。而当视图关闭时,该内存没有分配回来吗?

我是否需要在代码中做一些事情来返回ViewController或SpriteKit场景在加载时耗尽的内存?

编辑:根据要求,以下是VC加载SpriteKit场景时的一些代码以及用于关闭VC的代码:

override func viewDidLoad() {

    super.viewDidLoad()

    if let view = self.view as! SKView? {
        if let scene = SKScene(fileNamed: "GameScene.sks") {
            scene.scaleMode = .aspectFill
            view.presentScene(scene)
            (scene as! GameScene).parentVC = self
        }
    }

}

对于视图关闭,我首先在UIApplication.shared.keyWindow上方显示一个加载屏幕,然后关闭:

        dismiss(animated: true) {
        LoadingScreen?.removeFromSuperview()
    }

加载屏幕类在AppDelegate中处理。

1 个答案:

答案 0 :(得分:0)

我认为这是保留周期的问题

1  if let view = self.view as! SKView? {
2   if let scene = SKScene(fileNamed: "GameScene.sks") {
3      scene.scaleMode = .aspectFill
4     view.presentScene(scene)
5    (scene as! GameScene).parentVC = self
    }
}

如果第5行在闭包内部引用了self,那么当应该取消分配viewcontroller时,第5行的引用将停止重新分配,您可以尝试这样做吗:

if let view = self.view as! SKView? {  
    if let scene = SKScene(fileNamed: "GameScene.sks") {
        scene.scaleMode = .aspectFill
        view.presentScene(scene)
        guard  let scene = scene as? GameScene else { return }
        guard let scencePVC = scene.parentVC else { return }
        scencePVC = self 
    }
}

我试图在不知道对象层次结构的情况下解决此问题,但这很难。基本上,问题是您有两个互相引用的对象(视图控制器),这将停止释放。

您可以了解有关此问题的更多信息herehere