问题一:
在以下示例中,我向 foundMic 添加了一个侦听器。我的问题是如果我重新运行 foobar.initMic(); 要重新初始化麦克风,我最终会在内存中浮动一个死事件侦听器,它会被垃圾收集器拾取吗?调用 .getMicrophone() 只是将相同的资源重新附加到 foundMic 还是破坏旧的 foundMic 并在内存中创建一个新的 foundMic 实例。
就像它完全相同的 foundMic 一样,添加事件侦听器将静默失败并且不会创建第二个侦听器。但是,如果 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
问题二:
基于问题一,如果我在添加侦听器之前添加了一个删除侦听器,那实际上是否在第二次运行时删除了该方法第一次运行时创建的侦听器?或者 foundMic 已经是 .getMicrophone() 的一个新实例,所以没有任何内容被删除,因为第一个侦听器已经在与前一个 foundMic 实例关联的内存中浮动?
public static function initMic():void {
foundMic = Microphone.getMicrophone();
.
.
.
foundMic.removeEventListener(StatusEvent.STATUS, onMicStatusEvent);
foundMic.addEventListener(StatusEvent.STATUS, onMicStatusEvent);
return;
}