3

別のオブジェクトがそれらの1つに当たると、そのオブジェクトが削除されるオブジェクトの配列があります。removeChild()を使用してステージから削除し、splice()を使用して配列から削除しましたが、どういうわけか、オブジェクトはまだエラーの原因となっている関数の一部を呼び出しています。オブジェクトを完全に取り除くにはどうすればよいですか?それに関連付けられているイベントリスナーもありません。

4

7 に答える 7

4

削除する表示オブジェクトが次のことを確認する必要があります。

  • stage.removeEventListener(...)ステージにリスナーが登録されていません。たとえば、対応するリスナーを呼び出す必要があります。stage.addEventListener(...)
  • Event.ENTER_FRAMEイベントのリスナーがありません
  • タイマーのイベントをリッスンしません
  • setIntervalどこでも設定されたタイマーによって呼び出されません
  • など。基本的に、タイマー、ステージ、その親、ローダー、およびタイムラインに関係するものはすべて、オブジェクトが残り、削除されない可能性があります

したがって、オブジェクトをremoveChildで削除し、それを保持していた配列から削除した場合は、そのメソッドも呼び出しstopて、タイムラインが再生されていないことを確認してください。そのオブジェクトに のようなメソッドを呼び出したりhalt、リスナーの登録を解除したり、タイマー、タイムアウト、間隔などを停止したり、親、ステージ、または消えないオブジェクトも。cleanupfinalizenull

于 2008-09-16T18:53:02.543 に答える
1

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 を使用します。

于 2008-09-22T19:57:13.750 に答える
1

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

于 2008-09-16T05:14:44.337 に答える
0

関数を呼び出すには、定義上、リスナーまたはsetTimeOutがどこかに存在するか、タイムラインが再生されている必要があります。すべてのリスナーとオブジェクトへのすべての参照を必ず削除してください。どんな物ですか?

出力ウィンドウまたはデバッガーには、不要な呼び出しにつながった関数呼び出しのスタックが表示されます。エラー出力を質問に貼り付けると、より正確な回答を提供できるようになります。

于 2008-09-16T13:04:39.620 に答える
0

問題のオブジェクトはMovieClipであり、タイムラインが再生されていますか?その場合は、削除する前に停止する必要があります。また、オブジェクトへの参照を何らかの方法で(最も一般的にはイベントリスナーに)保存すると、オブジェクトがガベージコレクションされないようにすることにも注意してください。これには、関数または子オブジェクトへの参照が含まれます。

于 2008-09-16T07:18:13.820 に答える
0

Event.ENTER_FRAME および TimerEvent.TIMER リスナーを見て、オブジェクトを削除する前にそれらが無効になっていることを確認します。

于 2008-09-16T22:08:41.170 に答える
0

また、削除されたオブジェクトを破棄するときは、関連するすべてのタイマーを停止して削除することを忘れないでください: BIT-101: 実行中のタイマーはガベージ コレクションされません。これまで。

于 2008-09-16T16:01:02.660 に答える