2011-07-26 11 views
0

私はActionscript 2.0からActionscript 3.0に切り替えています。コードのいくつかの重要な行がありません。のは、私がミサイルを持っていたとしましょう、そしてそれは、ActionScript 2で、画面を離れたとき、私は、ActionScript 3.0ではactionscript 3.0にありますか?

removeMovieClip(this); 

を使用することになり、私は私が

parent.removeChild(this); 

問題を使用することになっていると思うです、コードはまだ実行されます。たとえば、フレーム1にトレースがあり、フレーム30にこのコードがあります。プログラムを実行するとフレーム1が実行され、オブジェクトは「消えます」と表示され、フレーム30私はTypeErrorを取得します。Error#1009:nullオブジェクト参照のプロパティまたはメソッドにアクセスできません。

どうしたのですか?/etcを正しく削除しないのですか?私はこれに類似した質問がいくつかあることを理解していますが、私が探している回答はないようです。前もって感謝します。

+0

これを削除した後はnullですが、親から行う必要があります。this.removeChild(child);子= null; –

+0

また、removeFromStageのイベントリスナーを追加して、そのオブジェクトをクリーンアップし、そのオブジェクト内で実行中のものを停止させることもできます。それから何とかそれを無効にしてください。これは結局のところOOPであり、オブジェクトはそれ自身を処理する必要があります。親の視点から行われなければならないnullingを除いて。 –

+0

あなたは私が持っていた同様の質問への答えをチェックしたいと思うかもしれません:http://stackoverflow.com/questions/6792291/reference-a-movieclip-symbol-later-on-in-the-timeline 「ルート」に存在しないオブジェクト(別名MCのフレーム1)。 – Alex

答えて

1

ディスプレイからディスプレイオブジェクトを削除しても、そのオブジェクトは破棄されません。手動でオブジェクトを破壊する必要があります。

var mc:MovieClip = new MovieClip(); 
addChild(mc); 
trace(mc); // traces [Object MovieClip] 

removeChild(mc); 
trace(mc); // traces [Object MovieClip] 

mc = null; 
trace(mc); // traces null 

オブジェクトを「null」に設定しても必ずしも破壊されるわけではありません。コード内でこのオブジェクトへのイベントリスナーや参照がある場合でも、Flashはそのオブジェクトをメモリに保持します。この場合、オブジェクトの "破棄"機能を作成したいと思うでしょう。この関数は、オブジェクトへの参照をすべて削除し、イベントリスナーを削除します。

+0

正しいステートメント(*ディスプレイから表示オブジェクトを削除してもオブジェクトは破棄されません。*)、信じられないほどひどい例です。 –

+0

これはちょっと正しいことですが、すべての参照をnullにするとコード実行が停止せず、ガベージコレクションの対象になります。ガベージコレクションは未定義の時点で発生します。コードはGCが実行されるまで実行されます。 –

+0

これは信じられないほど簡単な説明であることを意図していました。この例のMovieClipオブジェクトにはコードの実行はありません。私の答えで述べたように、nullを設定することは、コードの実行やオブジェクトへの参照がある場合には機能しません。 – Corey

0

オブジェクトはガベージコレクタによってクリーンアップされるまで、ActionScriptコードは実行を継続します。それを停止したい場合は、コード実行の原因となっているものを明示的に停止する必要があります。 enterframeイベントに頼っている場合は、myMovieClip.stop()というムービークリップで、リスナーを削除するだけです。

+0

あなたの答えをありがとう。だから私は1)ミサイルのx座標とy座標を-9999に設定し、2)parent.removeChild(this)、3)stop()、EnterFrameリスナーを削除することになります。そして、後で、私が同じ名前の子供を再び追加したいのであれば、それは何の問題もなく動作しますよね? – Bao

+0

正解ですが、必要に応じて後で追加できます。それで、play()を呼び出して、もう一度やり直したいと思うでしょう。 x/yを変更することは本当に不必要なステップですが、他の理由でこれを実行している可能性があります。 –

+0

@Baoあなたのポイントについて2) - 一般的には、子供を追加する責任を持つクラスをディスプレイリストにも含めて、削除するクラスにする必要があると思います。そうすれば、コードの流れを追跡し、何が起こっているのかを理解することがずっと簡単になります。 'isDead'のような何らかのフラグを変更するだけで、親クラスがそれを探して子を適切に削除させることができます。親クラスが子クラスのリスナーを保持している場合、これは特に重要です。 – Bakapii

0

ムービークリップにイベントリスナーが接続されていないことを確認する必要があります。また、ムービークリップへの参照(配列やその他のオブジェクト内)がないことを確認する必要があります。ムービークリップ自体を削除するには、mc = nullとする必要があります。

これ以外の場合、FlashPlayerはクリップをメモリに保持します。クリップが既に表示リストから削除されている場合でも、FlashPlayerは永久に存在します。

関連する問題