我用 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/