2017-02-03 5 views
1

メインメニューにゲームシーンが表示され、プレイヤーが負けたときにゲームシーンがメニューを表示します。メニューからゲームシーンに移行するときには、メニューが正常に呼び出されます。私の問題は、逆のことは起こらないということです(ゲームシーンからメニューシーンに移行するとき、は呼び出されません)。シーン間で遷移するときの保持サイクルのトラブル

私が作成した新しいメインメニューインスタンスとインスタンスを作成するゲームシーンの間に強い参照サイクルがあると思われます。シーンを提示しようとしているときに、実行時に事実、私は以下のように私gameSceneのコードを編集した場合、私はdeinitの呼び出しを得るかが、私のアプリのクラッシュの問題:実行時に

class GameScene: SKScene { 
    // Some stuff 

    // Now the function which is called when I want to present back the menu scene: 
    func lose() { 
     // Some stuff 

     // Delay is a helper function 
     delay(bySeconds: 2.0, closure: { [unowned self] in 
      for child in self.children { 
       child.removeFromParent() 
      } 

      unowned let menu = MainMenu(size: CGSize(width: 1152, height: 2048)) 
      let reveal = SKTransition.fade(with: SKColor.black, duration: 1.0) 

      self.view?.presentScene(menu, transition: reveal) 
     }) 

    } 
} 

私は次の取得エラー:

Attempted to retain deallocated object

ここで遅延の定義です:

public func delay(bySeconds seconds: Double, dispatchLevel: DispatchLevel = .main, closure: @escaping() -> Void) { 
    let dispatchTime = DispatchTime.now() + seconds 
    dispatchLevel.dispatchQueue.asyncAfter(deadline: dispatchTime, execute: closure) 
} 

public enum DispatchLevel { 
    case main, userInteractive, userInitiated, utility, background 
    var dispatchQueue: DispatchQueue { 
     switch self { 
     case .main:     return DispatchQueue.main 
     case .userInteractive:  return DispatchQueue.global(qos: .userInteractive) 
     case .userInitiated:  return DispatchQueue.global(qos: .userInitiated) 
     case .utility:    return DispatchQueue.global(qos: .utility) 
     case .background:   return DispatchQueue.global(qos: .background) 
     } 
    } 
} 

そして、ここに私のMainMenuクラスがあります:

class MainMenu: SKScene { 
    let gameScene = GameScene(size: CGSize(width: 1152, height: 2048)) 
    let reveal = SKTransition.fade(with: SKColor.black, duration: 1.0) 
    // Some stuff 
    // override func didMove(to ... 

    // Now the function which is called when I want to present the game scene: 
    func presentGame() { 
     view?.presentScene(gameScene, transition: reveal) 
    } 
} 

私はさまざまなことを試みましたが、うまくいかなかった(例:gameSceneのinitメソッドで新しいメニューインスタンスを設定するなど)。

私はGameSceneクラスの定数メニューの「所有されていない」定義を削除する場合は、移行が正常に行われているが、deinitは呼び出されません。

提案がありますか?

+0

があなたの代わりに「未所有の自己」の「弱い自分」を試してみましたか? – Emptyless

+0

はい、動作しません。 – gionti

答えて

0

最終的に私のゲームのシーンを自分自身の初期化解除から守っていたことがわかりました。

私の質問に提供したコードとは関係ありません。この問題は、加速度計の入力を解釈する役割を担っていたクロージャ内の強い「自己」参照に問題がありました。

あなたがより多くの情報に興味があるなら、ここを参照してください:Retain cycle suspected in closure

関連する問題