快速地,删除SKScene之后如何使内存恢复正常? [英] In swift, how to get memory back to normal after an SKScene is removed?
问题描述
我使用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屋!