swift - 由于内存问题而终止 - ViewControllers 占用内存
问题描述
我正在使用精灵套件开发游戏,并为不同的场景提供各种视图控制器。像故事模式,多人游戏等...
我注意到一个问题,每次我打开一个带有 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 中处理。
解决方案
我认为这是保留周期的问题
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,所以当视图控制器应该被释放时,第 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
}
}
我试图在不知道对象层次结构的情况下解决这个问题,但这很难。基本上问题是您有 2 个对象(视图控制器)相互引用,这将停止释放。
推荐阅读
- python - 如何让组合框在嵌套函数中工作?
- visual-studio - Visual Studio 不运行程序
- c# - 为什么 BLE 设备没有断开连接?
- reactjs - SelectInput react admin过滤选择中的重复值并仅显示唯一值
- r - 基于一个条件多次重复 t 检验
- php - 添加一个复选框以显示/隐藏结帐字段并在 WooCommerce 后端显示值
- javascript - 迭代失败的 Bull.js 作业并正确删除它们的最快方法是什么?
- reactjs - 为什么我不能让 Axios 设置 CSRF 令牌标头?
- python - CSV 到 JSON 使用循环
- python - 你如何在 for 循环后返回一个列表?