swift - 快速,删除 SKScene 后如何使内存恢复正常?

标签 swift memory sprite-kit skscene

我用 SpriteKit 创建了一个简单的游戏,但是每次运行游戏时,模拟器中的内存使用量都会增加大约 30mb,但游戏结束后不会减少。

当我运行游戏十次以上时,模拟器变得越来越慢,最终崩溃。

在这个简单的游戏中,我有两个 Controller 和一个游戏场景:

MainController 通过触发按钮调用 GameViewController

在 GameViewController 中,游戏场景是这样初始化的:

class GameViewController: UIViewController
{

  var skView:SKView!

  var scene:GameScene!

  override func viewDidLoad() {

      super.viewDidLoad()
      scene = GameScene(size: view.bounds.size)
      skView = view as SKView
      skView.ignoresSiblingOrder = true
      scene.scaleMode = .ResizeFill

      scene.viewController = self
      skView.presentScene(scene)

  }

//with a prepareForSegue deinitialises the scene and skview:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "GameFinished"{

        scene.removeAllActions()
        scene.removeAllChildren()
        scene.removeFromParent()
        scene = nil

        skView.presentScene(nil)
        skView = nil

        let target = segue.destinationViewController as MainController
    }
  }
}

在GameScene中,viewController是一个属性

var viewController:GameViewController? = GameViewController()

segue 是这样触发的:

self.viewController!.performSegueWithIdentifier("GameFinished", sender: nil)

我也试过将 remove 方法放入 GameScene 中的 deinit 中:

  deinit{
    self.removeAllActions()
    self.removeAllChildren()
  }

还是不行

最佳答案

您的 GameViewController 对您的 GameScene 有很强的引用。您的 GameScene 对您的 GameViewController 有很强的引用。这会导致强引用循环,这意味着两个对象都不会被释放。

您需要在 GameScene 中将 viewController 属性声明为 weak。

weak var viewController:GameViewController? = GameViewController()

关于swift - 快速,删除 SKScene 后如何使内存恢复正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30892837/

相关文章:

ios - 在 Sprite Kit 中,如何使坠落物体在相交时不会受到其他物体的影响?

ios - swift xcode 播放播放器列表中的声音文件

python - 在内存python中下载pdf

c - 从数组读取性能

python - 创建一组的所有组合并耗尽内存

ios - 如何在手指触摸时移动 Sprite ?

swift - 如何对 Sprite 集合运行一个 Action ?

cocoa - 在 Cocoa 程序中访问 Swift REPL

swift - 来自解析的数据不会在我的应用程序上打印

ios - 更新 SKPhysicsBody rectangleOfSize