Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 Actionscript中的垃圾收集匿名函数_Actionscript 3_Flash - Fatal编程技术网

Actionscript 3 Actionscript中的垃圾收集匿名函数

Actionscript 3 Actionscript中的垃圾收集匿名函数,actionscript-3,flash,Actionscript 3,Flash,假设有一个类,它加载一组图像并发送一个Event.COMPLETE。我们称之为资产装载机 然后,我们有一个主文档类,它执行如下操作: var myAssetLoader:AssetLoader = new AssetLoader(); myAssetLoader.addEventListener(Event.COMPLETE, function():void { doStuffWithImages(); }); myAssetLoader.loadUR

假设有一个类,它加载一组图像并发送一个Event.COMPLETE。我们称之为资产装载机

然后,我们有一个主文档类,它执行如下操作:

    var myAssetLoader:AssetLoader = new AssetLoader();
    myAssetLoader.addEventListener(Event.COMPLETE, function():void {
     doStuffWithImages();
    });

    myAssetLoader.loadURLS("http://example.com/image1.png", "http://example.com/image2.png");

    //Some time later, after doStuffWithImages()
    myAssetLoader = null

myAssetLoader会被完全垃圾回收吗?i、 e.没有任何removeEventListener?

在将引用设置为null之前,您应该
removeEventListener

  • 删除对对象的所有引用,以确保触发垃圾回收
  • 将对显示对象的引用设置为null并不能确保对象已冻结。对象继续消耗CPU周期,直到被垃圾回收在将对象的引用设置为null之前,请确保正确停用对象
  • 如果某个对象用作事件侦听器,则另一个对象可以引用它。如果是这样,在将引用设置为null之前,使用removeEventListener()方法删除事件侦听器

在这种情况下,是的,您的AssetLoader将被垃圾收集。事件处理程序是否为匿名函数

关键是在添加事件侦听器时,注意哪个对象保持对另一个对象的引用:当您说a.addEventListener(“event”,b.eventHandlerFunction)时,“a”对象保持对“b”对象的引用(当事件发生时,“a”需要执行“b”中的事件处理程序)

因此,如果我们丢弃“a”,并将“b”保留在内存中,“a”可以被垃圾收集,因为没有对象引用它。在您的例子中,“b”是主文档类,匿名函数属于该类。。。“a”是资产管理器


尽管如此,在另一个答案中给出的建议仍然是值得遵循的良好实践,即使您知道您的对象将获得g/c'd。

谢谢,但这并不能真正回答问题。没有其他对象真正引用myAssetLoader,因此问题是事件侦听器是否仍会在内存中逗留,以及该侦听器是否为匿名函数是否会产生影响。我编辑了上面的内容来澄清这一点。