假设有一个类加载一堆图像并在完成时调度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?
答案 0 :(得分:1)
在将引用设置为null之前,您应该removeEventListener
。
答案 1 :(得分:1)
在这种情况下,是的,您的AssetLoader将被垃圾收集。事件处理程序是否是匿名函数。
关键是在添加事件监听器时注意哪个对象维护对另一个对象的引用:当你说a.addEventListener(“event”,b.eventHandlerFunction)时,“a”对象维护对该对象的引用“b”对象(当事件发生时,“a”需要在“b”中执行事件处理程序。)
因此,如果我们丢弃“a”,并在内存中保留“b”,则“a”可以被垃圾收集,因为没有对象具有对它的引用。在你的情况下,“b”是主文档类,匿名函数属于...而“a”是AssetManager。
据说,即使你知道你的对象会得到g / c,其他答案中给出的建议仍然是好的做法。