快速地,删除SKScene之后如何使内存恢复正常? [英] In swift, how to get memory back to normal after an SKScene is removed?

查看:121
本文介绍了快速地,删除SKScene之后如何使内存恢复正常?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I created a simple game with SpriteKit, however every time I run the game, the memory usage in simulator increases about 30mb, but never decreases when the game is finished.

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

When I run the game over ten times the simulator gets slower and slower and eventually crashes.

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

In this simple game I have two controllers and a gamescene:

MainController通过触发的按钮调用GameViewController

MainController calls GameViewController via a button triggered

在GameViewController中,游戏场景是通过以下方式初始化的:

In GameViewController, gamescene is initialised in this way:

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是一个属性

In the GameScene, viewController is a property

var viewController:GameViewController? = GameViewController()

此触发是通过以下方式触发的:

the segue is triggered with this:

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

我还尝试过将删除方法放入GameScene的deinit中:

I've also tried putting remove methods into deinit in GameScene:

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

仍然无法正常工作

推荐答案

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

Your GameViewController has a strong reference to your GameScene. And your GameScene had a strong reference to your GameViewController. This leads to a strong reference cycle, which means that neither objects will be deallocated.

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

You need to declare your viewController property in your GameScene as weak.

weak var viewController:GameViewController? = GameViewController()

这篇关于快速地,删除SKScene之后如何使内存恢复正常?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆