Augmentation de la memory dans SpriteKit même si removeAllChildren appelé

J'ai essayé de réparer une énorme augmentation de memory dans SpriteKit pendant plusieurs semaines maintenant mais n'ai trouvé aucune solution. J'ai essayé à peu près toutes les methods que j'ai rencontrées en ligne pour gérer la memory en SK mais j'ai encore des problèmes. Voici ma situation:

Je présente d'abord le SKScene "HomeScreen" et à partir de là, je change les scènes de page avec un UIButton dans mon controller de vue comme ceci:

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 } } 

Et voici mon graphique de la memory de Xcode:

entrez la description de l'image ici

Comme vous pouvez le voir, ma memory pour HomeScreen (HS) commence à 38.1 et au moment où j'ai parcouru toutes les scènes et revenir à l'écran d'accueil, il se termine à 112. J'ai également chargé chaque page individuellement et enregistré la memory pour confirmer l'augmentation.

Dans chaque SKScene, je charge différents objects puis dans willMoveFromView je les supprime comme suit:

  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() } 

Voici un peu plus d'informations: – Deinit n'est pas appelé après qu'une scène change.

  • Je n'ai aucune fuite lors du test de l'application avec Instruments.

  • Tous les SKTextures sont d'abord chargés en UIImages en utilisant ssortingngByAppendingPathComponent.

  • Toutes les methods willMoveFromView contiennent removeAllActions et removeAllChildren.

Est-ce que quelqu'un sait pourquoi ma memory augmente?

Mettre à jour un peu plus de code

Voici comment je charge mon skView dans viewDidLoad:

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

Et voici un peu de ma Page01 SKScene:

 class Page01: SKScene { //Preload Textures let aaronHead01Texture = SKTexture(image: UIImage(contentsOfFile:NSBundle.mainBundle().resourcePath!.ssortingngByAppendingPathComponent("P01_head01.png"))!) let aaronHead02Texture = SKTexture(image: UIImage(contentsOfFile:NSBundle.mainBundle().resourcePath!.ssortingngByAppendingPathComponent("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) } 

Vous avez déjà trouvé le problème:

Deinit n'est pas appelé après une scène change.

Si quand une scene change, le deinit de l'ancienne scène n'est pas appelé alors c'est le problème. Cela signifie que la vieille scène est toujours en memory.

Cela arrive probablement parce que vous avez un fort cycle de rétention . Cela signifie qu'un enfant (ou un enfant d'un enfant …) de votre scène a une forte reference à la scène elle-même.

Vous devez find cette reference et la déclarer avec le mot key weak .