内存增加SpriteKit即使removeAllChildren调用

我一直在努力修复SpriteKit的内存增加了很多个星期,但是没有find解决办法。 我已经尝试了几乎所有在线pipe理SK内存的方法,但仍然遇到麻烦。 这是我的情况:

我首先介绍了SKScene的“HomeScreen”,然后从那里我用我的视图控制器中的UIButton来改变页面场景,就像这样:

func nextPage(sender: UIButton) { pageNumber = pageNumber + 1 let switchPage = SKTransition.crossFadeWithDuration(3.0) switchPage.pausesOutgoingScene = false switch pageNumber { case 1: self.skView.presentScene(Page01(size: (self.view?.bounds.size)!), transition: switchPage) case 2: self.skView.presentScene(Page02(size: (self.view?.bounds.size)!), transition: switchPage) case 3: self.skView.presentScene(Page03(size: (self.view?.bounds.size)!), transition: switchPage) case 4: self.skView.presentScene(Page04(size: (self.view?.bounds.size)!), transition: switchPage) case 5: self.skView.presentScene(Page05(size: (self.view?.bounds.size)!), transition: switchPage) case 6: self.skView.presentScene(Page06(size: (self.view?.bounds.size)!), transition: switchPage) case 7: self.skView.presentScene(Page07(size: (self.view?.bounds.size)!), transition: switchPage) case 8: self.skView.presentScene(Page08(size: (self.view?.bounds.size)!), transition: switchPage) case 9: self.skView.presentScene(Page09(size: (self.view?.bounds.size)!), transition: switchPage) case 10: self.skView.presentScene(Page10(size: (self.view?.bounds.size)!), transition: switchPage) case 11: self.skView.presentScene(Page11(size: (self.view?.bounds.size)!), transition: switchPage) default: break } } 

这里是我从Xcode的记忆图:

在这里输入图像说明

正如你所看到的,我对HomeScreen(HS)的记忆开始于38.1,并且在我已经循环遍历所有场景并回到主屏幕的时候,它结束于112.我还单独加载了每一页并logging了内存以确认增加。

在每个SKScene中,我加载各种对象,然后在willMoveFromView中删除它们,如下所示:

  override func willMoveFromView(view: SKView) { //Remove the Scroller Components self.view?.removeGestureRecognizer(self.page01Drops.panGestureRecognizer) self.page01Drops = nil //Remove Environment self.randomObjectFromScene.texture = nil self.anotherRandomObject.removeFromParent self.removeAllActions() self.removeAllChildren() } 

这里有一些更多的信息: – Deinit不会在场景更改后被调用。

  • 在使用仪器testing应用程序时,我没有泄漏。

  • 所有的SKTextures都使用stringByAppendingPathComponent作为UIImages首先加载。

  • 所有willMoveFromView方法都包含removeAllActions和removeAllChildren。

有谁知道为什么我的记忆在增加?

更新一些示例代码

这里是我如何加载我的skView viewDidLoad:

  skView = view as! SKView skView.showsFPS = true skView.showsNodeCount = true skView.ignoresSiblingOrder = false skView.presentScene(homeScreen(size: skView.bounds.size)) 

这是从我的Page01 SKScene:

 class Page01: SKScene { //Preload Textures let aaronHead01Texture = SKTexture(image: UIImage(contentsOfFile:NSBundle.mainBundle().resourcePath!.stringByAppendingPathComponent("P01_head01.png"))!) let aaronHead02Texture = SKTexture(image: UIImage(contentsOfFile:NSBundle.mainBundle().resourcePath!.stringByAppendingPathComponent("P01_head02.png"))!) //more textures for body parts of character that will be changed var aaronHead: SKSpriteNode! //More SKSpriteNodes for other body parts override init(size: CGSize){ super.init(size: size) self.aaronHead = SKSpriteNode(texture: self.aaronHead01Texture) self.aaronHead.anchorPoint = CGPoint(x: 0.5, y: 0.1) self.aaronHead.position = CGPoint(x: 10, y: 284) self.aaronHead.zPosition = 1.0 self.aaronBody.addChild(aaronHead) } 

你已经发现了这个问题:

在场景改变之后,Deinit不会被调用。

如果一个scene确实改变了旧场景的未命名,那么这就是问题所在。 这意味着旧的景象还在记忆中。

这可能是因为你有一个强大的保留周期 。 这意味着你的场景的一个孩子(或者一个孩子的孩子)对这个场景本身有很强的参考

您必须find该参考并用weak关键字进行声明。