【问题标题】:Garbage collecting anonymous functions in ActionscriptActionscript 中的垃圾收集匿名函数
【发布时间】:2014-01-07 13:32:09
【问题描述】:

假设有一个类加载一堆图像并在完成时调度 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?

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,但这并不能真正回答问题。没有其他对象真正引用 myAssetLoader,所以问题是事件侦听器是否仍会留在内存中,以及该侦听器是否是匿名函数是否会有所不同。我已经编辑了上面的内容以澄清一点。
    【解决方案2】:

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

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

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

    话虽如此,即使您知道您的对象会得到 g/c'd,其他答案中给出的建议仍然是可以遵循的良好做法。

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多