垃圾收集问题

时间:2010-11-02 23:01:44

标签: java c++ actionscript-3 garbage-collection

考虑以下代码段:

function loadSomeContent()
{
    URLLoader loader = new URLLoader("http://www.somesite.com/");

    loader.addEventListner("onLoadComplete", loadCompleteHandler);

    loader.sendHttpRequest();
}

function loadCompleteHandler(event)
{
    log("Load response received");
}

不要担心此代码的语法。

这是我关心的问题 - 用于发送HTTP请求且已注册 onLoadComplete 事件的加载器对象未从 loadSomeContent()外部引用功能。是否有可能垃圾收集加载器对象并且永远不会调用 loadCompleteHandler()

5 个答案:

答案 0 :(得分:5)

当您致电loader.sendHttpRequest()时,会创建一个新线程,该线程将在后台实际发送请求。该线程保持对加载器的引用,以便在加载完成时可以调用load complete函数。因此,加载器将始终由某个线程引用,而不是您现在所在的线程。

答案 1 :(得分:1)

没有。只要URLLoader包含仍在某处引用的回调(在这种情况下,它仍然由Javascript引擎/ JVM /引用,因为引擎必须稍后调用它。

答案 2 :(得分:0)

根据我的经验,不会收集URLLoaderLoader等活动加载程序对象(当它处于活动状态时)。

然而,一个不容错过的重点是,这是一种可观察到的行为,充其量,但它没有记录(至少,据我所知;我可能是错的)。

所以,尽管玩家使用内部机制来实现它(无论是创建新线程,使用集中式全局连接池等等),我认为你不应该依赖于此,因为你是将代码绑定到实现细节(同样,如果记录此行为,则不适用!)。

另外,正如我在评论中提到的,如果您在代码中使用它,则可以收集flash.net API FileReference中的一个类。

所以,总结一下:你可能只是根据当前工作的方式存储一个本地参考(并且基于观察!),但这不能保证,所以你最好存储一个非加载器处于活动状态时的本地引用。

答案 3 :(得分:0)

仅限于:

function loadCompleteHandler(e: event): void{
    (e.target as URLLoader).removeEventListner("onLoadComplete", loadCompleteHandler);
}

它应该由AS3 GC收集(这样就没有引用了,所以我们无法检查这个局部变量是否存在:)

答案 4 :(得分:0)

在actionscript中,加载器不会收集垃圾。事件处理程序仍然注册为链接,因为您没有添加弱引用。我实际上经常这样做是为了加载,我喜欢它,因为你不必存储对象数组来处理引用。

如果添加弱引用,这将会中断:

loader.addEventListner("onLoadComplete", loadCompleteHandler, false, 0, true);

如果您未在loadCompleteHandler中清除引用,则可能存在内存问题;

function loadCompleteHandler(event) {
    (event.currentTarget as URLLoader).removeEventListener('onLoadComplete');
}