在swift中,如何在删除SKScene后让内存恢复正常?

前端之家收集整理的这篇文章主要介绍了在swift中,如何在删除SKScene后让内存恢复正常?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我用SpriteKit创建了一个简单的游戏,但每次运行游戏时,模拟器中的内存使用量增加约30mb,但游戏结束后永远不会减少.

当我运行游戏超过十次时,模拟器变得越来越慢并最终崩溃.

在这个简单的游戏中我有两个控制器和一个gamecene:

MainController通过触发按钮调用GameViewController

在GameViewController中,gamescene以这种方式初始化:

  1. class GameViewController: UIViewController
  2. {
  3.  
  4. var skView:SKView!
  5.  
  6. var scene:GameScene!
  7.  
  8. override func viewDidLoad() {
  9.  
  10. super.viewDidLoad()
  11. scene = GameScene(size: view.bounds.size)
  12. skView = view as SKView
  13. skView.ignoresSiblingOrder = true
  14. scene.scaleMode = .ResizeFill
  15.  
  16. scene.viewController = self
  17. skView.presentScene(scene)
  18.  
  19. }
  20.  
  21. //with a prepareForSegue deinitialises the scene and skview:
  22. override func prepareForSegue(segue: UIStoryboardSegue,sender: AnyObject?) {
  23.  
  24. if segue.identifier == "GameFinished"{
  25.  
  26. scene.removeAllActions()
  27. scene.removeAllChildren()
  28. scene.removeFromParent()
  29. scene = nil
  30.  
  31. skView.presentScene(nil)
  32. skView = nil
  33.  
  34. let target = segue.destinationViewController as MainController
  35. }
  36. }
  37. }

在GameScene中,viewController是一个属性

  1. var viewController:GameViewController? = GameViewController()

segue被触发:

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

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

  1. deinit{
  2. self.removeAllActions()
  3. self.removeAllChildren()
  4. }

仍然行不通

您的GameViewController强烈引用您的GameScene.而你的GameScene对你的GameViewController有很强的参考价值.这导致强大的参考周期,这意味着两个对象都不会被释放.

您需要将GameScene中的viewController属性声明为弱.

  1. weak var viewController:GameViewController? = GameViewController()

猜你在找的Swift相关文章