2016-10-02 3 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

2番目のシーンのすべての画像が初期化されていませんか? – Acoop

答えて

1

基本的に、ゲームのメモリを増やす要因はたくさんあります。

私はいくつかの有用な修正を手伝っています。

カスタムプロトコルについて言えば、あなたは、行の末尾にclassを追加することにより、強い参照を破ると、デリゲートにweak varを宣言することができます:completionについていえば

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

weak var resumeBtnDelegate:ResumeBtnSelectorDelegate? 
... 

はそうselfへの強い参照することができあなたは、次の例のように行うことができます。

:アクション・ブロックを実行するための

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

同じことを

あなたが客観Cで第三部品ライブラリを使用する場合は、あなたもそこに強い参照を削除する必要があります。

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

あなたには、いくつかのオブザーバーをお持ちの場合は、willMoveFromView方法にNSTimersためsamething、それを削除してみてください。

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

アレッサンドロオルナーノありがとう!しかし、私はブロンドと初心者です。 – SashDing

+0

@SashDing Lol、何かを理解していないと尋ねると助けてくれるでしょう。 –

+0

私の脳が沸騰し始めました。 「A」のように1つのテクスチャしか使用しない場合、メモリは増加しません。どのようにテクスチャへのリンクを弱めるには? – SashDing

0

解決策が見つかりました。新しいGame Sceneはこのメソッドを使用する必要があります。

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

ありがとうございました。私は満足しています!

関連する問題