在swift中,移除场景后如何使内存恢复正常?

在swift中,移除场景后如何使内存恢复正常?,swift,memory,sprite-kit,skscene,Swift,Memory,Sprite Kit,Skscene,我用SpriteKit创建了一个简单的游戏,但是每次我运行游戏时,模拟器中的内存使用量都会增加大约30mb,但在游戏结束时,内存使用量不会减少 当我运行游戏超过十次时,模拟器变得越来越慢,最终崩溃 在这个简单的游戏中,我有两个控制器和一个游戏场景: MainController通过触发的按钮调用GameViewController 在GameViewController中,游戏场景的初始化方式如下: class GameViewController: UIViewController {

我用SpriteKit创建了一个简单的游戏,但是每次我运行游戏时,模拟器中的内存使用量都会增加大约30mb,但在游戏结束时,内存使用量不会减少

当我运行游戏超过十次时,模拟器变得越来越慢,最终崩溃

在这个简单的游戏中,我有两个控制器和一个游戏场景:

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
    }
  }
}
在游戏场景中,viewController是一个属性

var viewController:GameViewController? = GameViewController()
segue通过以下方式触发:

self.viewController!.performSegueWithIdentifier("GameFinished", sender: nil)
我还尝试在游戏场景中将移除方法放入Denit中:

  deinit{
    self.removeAllActions()
    self.removeAllChildren()
  }

仍然不起作用

您的
游戏视图控制器
强烈引用了您的
游戏场景
。您的
游戏场景
强烈引用了您的
游戏视图控制器
。这将导致一个强大的引用循环,这意味着两个对象都不会被释放

您需要将
游戏场景中的viewController属性声明为弱

weak var viewController:GameViewController? = GameViewController()

使用Swift 3、Xcode 8和iOS 10。 在避免强引用、处理SKTextures等之后,在关闭场景并返回“菜单”viewController后,内存级别没有恢复。 我使用的是:

override func sceneDidLoad() {...}
这在iOS 10中是可用的,但我想要iOS 8和9的兼容性,这就是为什么我 已更改为旧版本:

override func didMove(to view: SKView) {...}
除了与较旧的iOS版本兼容外,在关闭场景后,内存级别也会下降。这是一个惊喜。我可能漏掉了一些漏洞,但它对我有用。
我希望它能帮助别人

运行仪器并检查内存泄漏。不到30分钟前我也遇到过同样的问题。原来我有内存泄漏,所以我将我的视图和场景属性设置为“弱”,它消除了泄漏问题,但我不确定这是否是最好的方法。好的,我在游戏结束后使用dismissViewControllerAnimated而不是PerformsgueWithIdentifier,没有removeAllChildren和removeAllActions方法,它似乎“起作用”。。。每次游戏启动时,记忆都会以非常小的数量增加……怎么会发生这种情况?@FanZhang你能解释一下你是怎么做到的吗?我现在也遇到了同样的问题,我真的希望能得到解决…没什么特别的,只是在GameSecene:weak var viewController:GameViewController中实例化GameViewController?=GameViewController(),并在游戏结束时运行self.viewController?.dismissViewControllerAnimated(true,完成:nil)。谢谢!我的viewcontroller对SKView的引用已经很弱了,但是在我的SKScene中,对它所在的viewcontroller有一个很强的引用,通过创建一个弱var,我的内存使用率在弹出后又下降了。哇,这真是一个巨大的不同!这应该被标记为这个问题的正确答案。你能创建一个最小的可验证的例子来证明这个漏洞吗?@Whirlwind抱歉,我已经尝试过了,但我无法做到这一点。泄漏工具显示了一些与“SKAction.animate”相关的泄漏,我还没有解决。我原以为这就是问题所在,但现在,只有改为“didMove”时,内存问题才消失了。