2016-10-02 25 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() 
    } 

謝謝大家的幫忙。我很高興!