在swift中,如何在删除SKScene后让内存恢复正常?
发布时间:2020-12-14 05:44:45 所属栏目:百科 来源:网络整理
导读:我用SpriteKit创建了一个简单的游戏,但每次运行游戏时,模拟器中的内存使用量增加约30mb,但游戏结束后永远不会减少. 当我运行游戏超过十次时,模拟器变得越来越慢并最终崩溃. 在这个简单的游戏中我有两个控制器和一个gamecene: MainController通过触发按钮调
我用SpriteKit创建了一个简单的游戏,但每次运行游戏时,模拟器中的内存使用量增加约30mb,但游戏结束后永远不会减少.
当我运行游戏超过十次时,模拟器变得越来越慢并最终崩溃. 在这个简单的游戏中我有两个控制器和一个gamecene: MainController通过触发按钮调用GameViewController 在GameViewController中,gamescene以这种方式初始化: 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) 我也试过在GameScene中将remove方法放入deinit: deinit{ self.removeAllActions() self.removeAllChildren() } 仍然行不通
您的GameViewController强烈引用您的GameScene.而你的GameScene对你的GameViewController有很强的参考价值.这导致强大的参考周期,这意味着两个对象都不会被释放.
您需要将GameScene中的viewController属性声明为弱. weak var viewController:GameViewController? = GameViewController() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |