2017-05-03 7 views
1

私は、このクラスから継承するために移行しようとしていますので、彼らのすべてがこの機能を持っているこの機能を保持しているクラスSKViewがnilを返す場合、どのように修正するのですか?

func valueChanged() { 
    run(tapSound) 
    let sceneto = scenes[segment.selectedSegmentIndex] 
    let trans = SKTransition.fade(with: .white, duration: 1.5) 
    if view == nil { 
     print("view is nil") 
    } else { 
     view?.presentScene(sceneto, transition: trans) 
     print("ran",segment.selectedSegmentIndex,scenes.count) 
    } 
} 

各シーンを持っています。しかし、この関数は一度正常に動作し、シーンは変わりますが、最初からビューは何も返されず、なぜわかりません。この機能は、各シーンが継承するクラスにあります。違いがある場合は

+1

あなたの質問には十分な情報がありません。 'view'はこの関数と同じクラスで宣言されていますか?これらのクラス間で共有されるべき単一の 'SKView'インスタンスはありますか? 'view'はどのように設定されていますか? –

+0

ビューは別のビュークラスではないので、このクラスはビューを一切削除してはいけません。アプリケーションが読み込まれるとビューが設定されます。 –

+1

私は、あなたの問題はこのコードではなく、 'view'変数、どこでどのように宣言され、どのように設定されるのかということです。 –

答えて

0

あなたの質問には私が正しく診断するための情報が必要ですが、SKScene ARC (Automatic Reference Count)を扱っていることから、割り当てを解除する必要があります。

基本的に、アプリケーションは誰かがまだそれを使用している限り、クラスを保持します。クラスインスタンスを作成すると、そのインスタンスのARCは1に設定されます。インスタンスを別の場所に保存すると、最大2になります。これらのインスタンスがnilに設定されると、毎回1つずつARCが削除されます。ゼロに達すると、どこにも使用されておらず、割り当ても解除されます。

あなたの配列がSKSceneインスタンスに対してweakの変数を使用している可能性があります。 weakstrongの違いは、前者はARCに1を加えず、後者はARCに1を加えないことです。 scenes[segment.selectedSegmentIndex]が弱い変数を参照する場合は、割り当てが解除されたかどうかに応じて、定義されたSKSceneまたはnilのいずれかになります。

scenes[]変数は特定のシーンのインスタンスを参照している可能性が最も高いのですが、そのシーンが終了して却下されると、そのインスタンスはnilに設定されます。

SKSceneの特定のインスタンスを保持したくない場合があります。そうしないと、不要なメモリが使い果たされ、すでに再生されているシーンがロードされます。

クラスの型を配列内に保持し、遷移前にシーンを再作成する方がよいでしょう。

関連する問題