Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 Flex AS3-关于变量实例、事件侦听器和垃圾收集_Actionscript 3_Apache Flex - Fatal编程技术网

Actionscript 3 Flex AS3-关于变量实例、事件侦听器和垃圾收集

Actionscript 3 Flex AS3-关于变量实例、事件侦听器和垃圾收集,actionscript-3,apache-flex,Actionscript 3,Apache Flex,问题一: 在下面的示例中,我在foundMic中添加了一个侦听器。我的问题是是否重新运行foobar.initMic();要重新初始化麦克风,我会在内存中浮动一个死掉的事件侦听器,它会被垃圾收集接收吗?调用.get麦克风()只是将同一资源重新连接到foundMic,还是销毁旧的foundMic并在内存中创建foundMic的新实例 如果它与foundMic完全相同,那么添加事件侦听器将自动失败,并且不会创建第二个侦听器。但如果foundMic成为一个新实例,那么它将创建一个新的侦听器。然后回到关

问题一:

在下面的示例中,我在foundMic中添加了一个侦听器。我的问题是是否重新运行foobar.initMic();要重新初始化麦克风,我会在内存中浮动一个死掉的事件侦听器,它会被垃圾收集接收吗?调用.get麦克风()只是将同一资源重新连接到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
问题二:

基于第一个问题,如果我在添加侦听器之前添加了一个remove侦听器,那么在第一次运行该方法时创建的第二次运行时,是否确实删除了该侦听器?或者该foundMic已经是.getMirror()中的一个新实例,因此不会删除任何内容,因为第一个侦听器已经在与foundMic的上一个实例关联的内存中浮动

    public static function initMic():void {
        foundMic = Microphone.getMicrophone();
        .
        .
        .
        foundMic.removeEventListener(StatusEvent.STATUS, onMicStatusEvent);
        foundMic.addEventListener(StatusEvent.STATUS, onMicStatusEvent);
        return;
     }

foundMic将被分配一个新值,该值是对麦克风的引用-不应进行垃圾收集

垃圾收集器应该启动的情况如下:

var someVar:Sprite;
for(var i:int = 0; i < 5; i++)
{
    someVar = new Sprite();
}

此代码将始终首先删除事件侦听器(如果存在),然后添加新的事件侦听器。但是,在这种情况下,我看不出有什么原因,因为addEventListener本身应该可以正常工作-多个调用都在同一个对象上,所以无论调用initMic()多少次您应该只运行一个事件侦听器-无需手动删除侦听器然后重新创建。

foundMic将被分配一个新值,该值是对麦克风的引用-不应进行垃圾收集

垃圾收集器应该启动的情况如下:

var someVar:Sprite;
for(var i:int = 0; i < 5; i++)
{
    someVar = new Sprite();
}

此代码将始终首先删除事件侦听器(如果存在),然后添加新的事件侦听器。但是,在这种情况下,我看不出有什么原因,因为addEventListener本身应该可以正常工作-多个调用都在同一个对象上,所以无论调用initMic()多少次您应该只运行一个事件侦听器-无需手动删除侦听器然后重新创建。

以下是事件侦听器的情况
someObject.addEventListener('someEvent',someFunction)
hands
someObject
someFunction
的引用。由于ActionScript中作用域的工作方式,函数将可以访问创建它的代码作用域中的所有内容。因此,在调用
removeEventListener
之前,只要
someObject
在内存中,函数存在的实例就会被保存在内存中

然而,在您的情况下,没有实例,因为通过使用静态函数,您的侦听器将从类
FooBar
第一次被引用时开始存在,直到您的swf从计算机内存中取出

在添加侦听器之前删除它不会产生任何净效果,因为它是传递给完全相同对象的完全相同的函数,不会调用您的函数两次


有关事件侦听器如何工作的详细信息,请参见。

以下是事件侦听器的操作
someObject.addEventListener('someEvent',someFunction)
hands
someObject
someFunction
的引用。由于ActionScript中作用域的工作方式,函数将可以访问创建它的代码作用域中的所有内容。因此,在调用
removeEventListener
之前,只要
someObject
在内存中,函数存在的实例就会被保存在内存中

然而,在您的情况下,没有实例,因为通过使用静态函数,您的侦听器将从类
FooBar
第一次被引用时开始存在,直到您的swf从计算机内存中取出

在添加侦听器之前删除它不会产生任何净效果,因为它是传递给完全相同对象的完全相同的函数,不会调用您的函数两次


有关事件侦听器如何工作的详细信息,请参见。

您的解释很有意义,我只需要第一部分代码,谢谢。在您关于删除上的错误的评论中,它没有错误(已测试)。AdobeDocs声明这是一个无声的失败,没有伤害,没有犯规。我认为在删除未添加的事件侦听器时不会出现错误。如果你这样做了,我的代码就会一直有各种各样的错误。此外,函数不是程序性的。仅仅因为它发生在另一个函数下面的类主体中,并不意味着它还没有“存在”。很抱歉,我不得不对此进行否决,因为在这个答案中有太多技术上不准确的信息。@AmyBlankenship我的意思是foundMic还没有附加事件侦听器,可能措辞不恰当,但我认为没有错。但是我同意我在没有添加事件侦听器的情况下删除它们是错误的。您的解释很有道理,看起来我只需要代码的第一部分,谢谢。在您关于删除上的错误的评论中,它没有错误(已测试)。AdobeDocs声明这是一个无声的失败,没有伤害,没有犯规。我认为在删除未添加的事件侦听器时不会出现错误。如果你这样做了,我的代码就会一直有各种各样的错误。此外,函数不是程序性的。仅仅因为它发生在另一个函数下面的类主体中,并不意味着它还没有“存在”。很抱歉,我不得不对此进行否决,因为这个答案中有太多技术上不准确的信息。@AmyBlan