首页 > 解决方案 > 由于内存问题而终止 - ViewControllers 占用内存

问题描述

我正在使用精灵套件开发游戏,并为不同的场景提供各种视图控制器。像故事模式,多人游戏等...

我注意到一个问题,每次我打开一个带有 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 中处理。

标签: swiftsprite-kit

解决方案


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

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,所以当视图控制器应该被释放时,第 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 
    }
}

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

您可以在此处此处阅读有关此问题的更多信息


推荐阅读