1

removeEventListener は dealloc として必要ですか?

AS3 でメモリ リークが発生する可能性があることはわかっていますが、イベント リスナーを削除しないことがその方法の 1 つなのかどうか疑問に思っています。

4

2 に答える 2

4

はい、そうです。あるインスタンスを別のインスタンスのスコープに「バインド」するからです。したがって、イベントを正しく処理しないと、アプリケーション全体で相互参照が発生し、ガベージ コレクションはオブジェクトを見つけられず、メモリから解放される可能性があります。

于 2012-06-04T07:47:26.090 に答える
4

はい、eventListenerを削除せずに巨大なプロジェクトを作成しました。長い間使用すると、本当に多くのメモリが得られます...

強い参照を持つオブジェクトは、その強い参照が削除されるまでガベージ コレクションされません。これは、イベント リスナー、バインディングなどに適用されます。

removeEventListener(Event.TYPE, function) またはweakReferenceを使用して手動でEventListenerを削除できます...

WeakReference を使用してイベント リスナーを追加するには、addMethod にパラメーターを追加するだけです...

obj.addEventListener(Event.Type, Function, false, 0, true)

addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void

パラメータ:
typeイベントのタイプ。
listenerイベントを処理するリスナー関数。次の例に示すように、この関数は唯一のパラメーターとしてイベント オブジェクトを受け入れ、何も
返さなければなりません。
function(evt:Event):void

関数には任意の名前を付けることができます。
useCaptureリスナーがキャプチャ フェーズで機能するか、ターゲットおよびバブリング フェーズで機能するかを決定します。useCapture が true に設定されている場合
、リスナーはキャプチャ フェーズでのみイベントを処理し、ターゲットまたはバブリング フェーズでは処理しません。useCapture が false の場合、リスナーはターゲットまたはバブリング フェーズでのみイベントを処理します。3 つのフェーズすべてでイベントをリッスンするには、addEventListener() を 2 回呼び出します。1 回目は useCapture を true に設定し、次に useCapture を false に設定します。
優先順位イベントリスナーの優先度。優先度は 32 ビット整数で指定されます。数値が大きいほど優先度が高くなります。優先順位 n のすべてのリスナーは、優先順位 n-1 のリスナーの前に処理されます。2 つ以上のリスナーが同じ優先度を共有する場合、それらは追加された順序で処理されます。デフォルトの優先度は 0
です。 useWeakReferenceリスナーへの参照が強いか弱いかを決定します。強い参照 (デフォルト) は、リスナーがガベージ コレクションされるのを防ぎます。弱い参照はそうではありません。
クラスレベルのメンバー関数はガベージの対象にならない

于 2012-06-04T09:41:14.617 に答える