2016-10-02 68 views
1

我有一个游戏,其中按下按钮调用新场景。当你点击一个新的场景发送相应的图片。当你回到游戏地图时,内存总是增加30 MB。我不明白哪里最强的链接。仪器无法检测到泄漏。对不起我的英文。请帮帮我。切换到新场景时内存增长

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    for touch: AnyObject in touches { 

     let location = touch.location(in: self) 

     for i in 0...3 { 


      if childNode(withName: "button\(i)")!.isHidden == false && childNode(withName: "button\(i)")!.contains(location) { 
       buttonOfBattlefield = childNode(withName: "button\(i)") 
       } 
      } 


       switch buttonOfBattlefield?.name { 
       case "button0"?: 
        battlefieldName = "A" 
       case "button1"?: 
        battlefieldName = "B" 
       case "button2"?: 
        battlefieldName = "C" 
       case "button3"?: 
        battlefieldName = "D" 

       default: 
        break 
       } 

      if battlefieldName != nil { 
       let myScene = GameScene(size: self.size , battlefield: battlefieldName!) 
       myScene.scaleMode = self.scaleMode 
       let reveal = SKTransition.fade(withDuration: 2.0) 
       self.view?.presentScene(myScene, transition: reveal) 


     } 

    } 
} 
+0

你如何从这个次要视图继续?你是否正确地将其初始化? – Acoop

+0

我使用deinit进行测试。它的工作原理 – SashDing

+0

第二场景中的所有图像都被初始化了吗? – Acoop

回答

1

基本上可能有很多因素会导致游戏内存增加。

我试着帮助你一些有用的更正。

谈到定制协议,可以通过在该行的末尾添加class突破强引用,并声明weak var给委托:

protocol ResumeBtnSelectorDelegate: class { 
    func didPressResumeBtn(resumeBtn:SKSpriteNode) 
} 

weak var resumeBtnDelegate:ResumeBtnSelectorDelegate? 
... 

谈到completion可能是一个很强的参考self如此你可以做这样的例子:

self.launchVideo(completion: { 
    [weak self] success in 
    guard let strongSelf = self else { return } 
    //self.showMyVideo() 
    strongSelf.showMyVideo() 
} 

运行动作块一样的东西如果你有一些观察者尝试删除它,samething为NSTimers到willMoveFromView方法

__weak __typeof__(self) weakSelf = self; 
SKAction *sequence = [SKAction sequence:@[[SKAction followPath:_ascentPath duration:1.5], [SKAction runBlock:^(void){[weakSelf explode];}]]]; 
[self runAction:sequence]; 
} 

如果您在Objective C中使用第三方库,您可能需要删除也有强烈的引用。

override func willMove(from view: SKView) { 
    //remove UIKit objects, observers, timers.. 
} 
+0

Alessandro Ornano谢谢你!但我是金发女郎和新手 – SashDing

+0

@SashDing哈哈,如果你不明白的话问一下,我会尽力帮助。 –

+0

我的大脑开始沸腾了。如果我们只使用一个纹理,比如“A”,内存不会增加。如何削弱与纹理的链接? – SashDing

0

找到解决方案。新的游戏场景需要使用该方法。

self.enumerateChildNodes(withName: "//*"){ (node, stop) -> Void in 
     node.removeAllActions() 
     node.removeAllChildren() 
     node.removeFromParent() 
    } 

谢谢大家的帮忙。我很高兴!