質問1:
次の例では、iveがfoundMicにリスナーを追加しました。私の質問は、foobar.initMic();を再実行するかどうかです。マイクを再初期化するために、デッドイベントリスナーがメモリに浮かんでしまい、ガベージコレクションによってピックアップされますか?.getMicrophone()を呼び出すと、同じリソースがfoundMicに再接続されるだけですか、それとも古いfoundMicが破棄され、メモリ内にfoundMicの新しいインスタンスが作成されますか。
まったく同じfoundMicの場合と同様に、イベントリスナーの追加はサイレントに失敗し、2番目のリスナーは作成されません。ただし、foundMicが新しいインスタンスになると、新しいリスナーが作成されます。次に、ガベージコレクションについての質問に戻りますが、クリーンアップのために参照されていないと見なされますか?
public class foobar {
public static var foundMic:Microphone = null;
public static function initMic():void {
foundMic = Microphone.getMicrophone();
foundMic.codec = SoundCodec.SPEEX;
foundMic.setSilenceLevel(0, 5000);
foundMic.gain = 50;
foundMic.setUseEchoSuppression(true);
foundMic.soundTransform.volume = 1;
foundMic.addEventListener(StatusEvent.STATUS, onMicStatusEvent);
return;
}
public static function onMicStatusEvent(event:StatusEvent):void {
if (foundMic && !foundMic.muted) someButton.enabled = true;
else someButton.enabled = false;
return;
}
} // END CLASS
質問2:
質問1に基づいて、リスナーを追加する直前に削除リスナーを追加した場合、メソッドが最初に実行されたときに作成された2回目の実行時に実際にリスナーが削除されますか?または、そのfoundMicはすでに.getMicrophone()から新しいインスタンスであるため、最初のリスナーがfoundMicの前のインスタンスに関連付けられたメモリにすでにフローティングしているため、何も削除されませんか?
public static function initMic():void {
foundMic = Microphone.getMicrophone();
.
.
.
foundMic.removeEventListener(StatusEvent.STATUS, onMicStatusEvent);
foundMic.addEventListener(StatusEvent.STATUS, onMicStatusEvent);
return;
}