1

イベントリスナーとオブジェクトへの参照により、ガベージコレクターがオブジェクトを処理できなくなることはわかっています。私の質問は、同じオブジェクトをリッスンしているオブジェクトに配置されたイベントリスナーは、そのオブジェクトがガベージコレクションされるのを防ぐのでしょうか?

これが私に起こっているように思われるので、私は尋ねます。オブジェクトへのすべての参照を壊していますが、タイマーがオフになったときにまだトレースが表示されています。同時に、割り当てられているが参照できないメモリが作成されるため、これによって収集が妨げられることはないようです。

4

2 に答える 2

4

いいえ、でも。

AVM2ガベージコレクタは、到達不能なオブジェクトを検出することになっています。しかし、ガベージコレクションは非決定論的であるため、この動作に依存したり、テストしたりすることは非常に困難です。ガベージコレクターは完全に機能している可能性がありますが、十分なRAMが空いているため、マークアンドスイープを実行する必要はありません。 。

オブジェクト自体(循環参照)からのものであっても、オブジェクトの使用が終了したら、イベントリスナーを削除することをお勧めします。なぜこれが良い考えなのですか?ガベージコレクタがいつ実行されるかわからないためです。決定論的な動作が必要な場合は、特にTIMERやENTER_FRAMEなどの時間に敏感なイベントの場合は、常に決定論的な方法でリスナーを削除してください。そうしないと、実行中のリスナーとガベージコレクターの実行中に競合状態が発生します。ガベージコレクタは定期的にのみ実行されます。

useWeakReference一般に、オブジェクトへの追加の参照を作成せずにイベントリスナーをアタッチする場合は、のパラメーターにtrueを渡しますaddEventListener()。ただし、イベントの受信をすぐに停止したい場合は、オブジェクトの処理が完了したらすぐに、イベントリスナーを手動で切り離す必要があります。

于 2012-04-24T01:09:35.270 に答える
0

はい、これにより、GCによるオブジェクトのクリーンアップが停止します。これを防ぐためのハッキーな方法は、リスナーを追加するときに弱参照を使用することです。

 myobj.addEventListener(Event.EVENT, eventHandler, false, 0, true);

最後のtrueフラグは、弱いオブジェクト参照を使用するようにリスナーを設定します。

ベストプラクティスは、オブジェクトをnullにする前に、追跡し、アクティブなリスナーを常に削除することです。

このトピックの詳細については、このすばらしいブログ投稿を確認してください。

http://gskinner.com/blog/archives/2006/06/as3_resource_ma.html

于 2012-04-24T00:57:42.590 に答える