我正在使用Sprite套件开发游戏,并且具有用于不同场景的各种视图控制器。像故事模式,多人游戏等...
我注意到一个问题,每次打开带有SpriteKit场景的视图控制器时,我的应用程序的内存使用量都会增加。而当视图关闭时,该内存没有分配回来吗?
我是否需要在代码中做一些事情来返回ViewController或SpriteKit场景在加载时耗尽的内存?
编辑:根据要求,以下是VC加载SpriteKit场景时的一些代码以及用于关闭VC的代码:
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView? {
if let scene = SKScene(fileNamed: "GameScene.sks") {
scene.scaleMode = .aspectFill
view.presentScene(scene)
(scene as! GameScene).parentVC = self
}
}
}
对于视图关闭,我首先在UIApplication.shared.keyWindow上方显示一个加载屏幕,然后关闭:
dismiss(animated: true) {
LoadingScreen?.removeFromSuperview()
}
加载屏幕类在AppDelegate中处理。
答案 0 :(得分:0)
我认为这是保留周期的问题
1 if let view = self.view as! SKView? {
2 if let scene = SKScene(fileNamed: "GameScene.sks") {
3 scene.scaleMode = .aspectFill
4 view.presentScene(scene)
5 (scene as! GameScene).parentVC = self
}
}
如果第5行在闭包内部引用了self,那么当应该取消分配viewcontroller时,第5行的引用将停止重新分配,您可以尝试这样做吗:
if let view = self.view as! SKView? {
if let scene = SKScene(fileNamed: "GameScene.sks") {
scene.scaleMode = .aspectFill
view.presentScene(scene)
guard let scene = scene as? GameScene else { return }
guard let scencePVC = scene.parentVC else { return }
scencePVC = self
}
}
我试图在不知道对象层次结构的情况下解决此问题,但这很难。基本上,问题是您有两个互相引用的对象(视图控制器),这将停止释放。