【问题标题】:Terminated due to memory issue - ViewControllers taking up memory由于内存问题而终止 - ViewControllers 占用内存
【发布时间】:2018-12-03 16:22:23
【问题描述】:

我正在使用 sprite kit 开发一款游戏,并为不同的场景提供各种视图控制器。比如故事模式、多人游戏等等……

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

【问题讨论】:

  • 这将有助于查看一些代码,这将让人们看到哪里可能存在错误或优化机会
  • 这就是我有很多代码的东西。特别是整个游戏,因此我想我会先问这个问题,然后我可以根据人们想要看到的内容分享特定部分的特定代码。坦率地说,我不知道哪个部分有贡献,所以希望有人能指出我需要查看的内容。
  • 你说它发生在你加载一个视图控制器时。因此,显示该代码,以及解除它的代码。甚至可能提供一张关于您的视图控制器如何链接在一起的高级结构的图片
  • 好的,谢谢,我已经添加了该代码。我不确定什么是高级结构,你的意思是像一个像树一样显示它们的连接的图像吗?

标签: swift sprite-kit


【解决方案1】:

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

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 
    }
}

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

您可以阅读有关此问题的更多信息here & here

【讨论】:

  • 感谢您的帮助,我对 swift 有点陌生,当我尝试您的建议“一行上的连续语句必须用 ';' 分隔”时出现错误格式错误?
  • 嗨,谢谢你的编辑,但是你说 let pvc = parentVC 这不是 View Controller 上的一个类,然后你得到: Scene as GameScene has no member of pvc ?
  • 嗨,我可以看到你再次编辑了它,但我不得不将保护 let scenePVC 更改为 var,因为无法将值分配给 let。然后,scencePVC = self 发出警告:变量 'scencePVC' 已写入,但从未读取
猜你喜欢
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多