垃圾收集ActionScript中的匿名函数

时间:2014-01-07 13:32:09

标签: actionscript-3 flash

假设有一个类加载一堆图像并在完成时调度Event.COMPLETE。我们称之为AssetLoader

然后我们有我们的主文档类,它做了类似的事情:

    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会被完全垃圾收集吗?即没有任何removeEventListener?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

因此,如果我们丢弃“a”,并在内存中保留“b”,则“a”可以被垃圾收集,因为没有对象具有对它的引用。在你的情况下,“b”是主文档类,匿名函数属于...而“a”是AssetManager。

据说,即使你知道你的对象会得到g / c,其他答案中给出的建议仍然是好的做法。