別のオブジェクトがそれらの1つに当たると、そのオブジェクトが削除されるオブジェクトの配列があります。removeChild()を使用してステージから削除し、splice()を使用して配列から削除しましたが、どういうわけか、オブジェクトはまだエラーの原因となっている関数の一部を呼び出しています。オブジェクトを完全に取り除くにはどうすればよいですか?それに関連付けられているイベントリスナーもありません。
7 に答える
削除する表示オブジェクトが次のことを確認する必要があります。
stage.removeEventListener(...)
ステージにリスナーが登録されていません。たとえば、対応するリスナーを呼び出す必要があります。stage.addEventListener(...)
Event.ENTER_FRAME
イベントのリスナーがありません- タイマーのイベントをリッスンしません
setInterval
どこでも設定されたタイマーによって呼び出されません- など。基本的に、タイマー、ステージ、その親、ローダー、およびタイムラインに関係するものはすべて、オブジェクトが残り、削除されない可能性があります
したがって、オブジェクトをremoveChild
で削除し、それを保持していた配列から削除した場合は、そのメソッドも呼び出しstop
て、タイムラインが再生されていないことを確認してください。そのオブジェクトに のようなメソッドを呼び出したりhalt
、リスナーの登録を解除したり、タイマー、タイムアウト、間隔などを停止したり、親、ステージ、または消えないオブジェクトも。cleanup
finalize
null
AS3 でオブジェクトを完全に削除するには、その値を null に設定する必要があります。ガベージ コレクションへの参照がないため、ガベージ コレクションで問題なく削除できます。また、イベントリスナーで「弱い参照」を使用すると役立つ場合があります。イベントリスナーを作成する場合、通常はイベントタイプと起動される関数です。
addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend);
以下に同じことを示しますが、参照は弱いです。
addEventListener(SomeEvent.EVENT_HAPPEND, onEventHappend, false, 0, true);
最初の 2 つのパラメーターが何であるかはわかっているので、3 番目のパラメーターから始めましょう。3 番目のパラメーターは、キャプチャ フェーズ (true) またはバブリング フェーズ (デフォルトでもある false) の間にイベントが onEventHappened 関数を起動するかどうかを指定します。このパラメーターについて言及している唯一の理由は、弱参照パラメーターを設定する前に必要だからです。4 番目のパラメーターは優先度で、イベント フローの同じオブジェクトと同じフェーズをリッスンするときに、どのイベントが優先されるかを指定します。5 番目のパラメーターは、弱い参照を true または false に設定します。この場合、ガベージ コレクションに役立つ true を使用します。
Flash Player でガベージ コレクションの問題が発生している可能性があります。
これに対処する新しい API が Flash Player 10 に追加されました。
unloadAndStop()
Grant Skinner は、彼のブログでこれに関する詳細情報を持っています: http://www.gskinner.com/blog/archives/2008/07/unloadandstop_i.html
Flash Player 10 のベータ版は、次の場所で入手できます。
http://labs.adobe.com/technologies/flashplayer10/
マイク・チェンバーズ
mesh@adobe.com
関数を呼び出すには、定義上、リスナーまたはsetTimeOutがどこかに存在するか、タイムラインが再生されている必要があります。すべてのリスナーとオブジェクトへのすべての参照を必ず削除してください。どんな物ですか?
出力ウィンドウまたはデバッガーには、不要な呼び出しにつながった関数呼び出しのスタックが表示されます。エラー出力を質問に貼り付けると、より正確な回答を提供できるようになります。
問題のオブジェクトはMovieClipであり、タイムラインが再生されていますか?その場合は、削除する前に停止する必要があります。また、オブジェクトへの参照を何らかの方法で(最も一般的にはイベントリスナーに)保存すると、オブジェクトがガベージコレクションされないようにすることにも注意してください。これには、関数または子オブジェクトへの参照が含まれます。
Event.ENTER_FRAME および TimerEvent.TIMER リスナーを見て、オブジェクトを削除する前にそれらが無効になっていることを確認します。
また、削除されたオブジェクトを破棄するときは、関連するすべてのタイマーを停止して削除することを忘れないでください: BIT-101: 実行中のタイマーはガベージ コレクションされません。これまで。