考虑以下代码段:
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()?
答案 0 :(得分:5)
当您致电loader.sendHttpRequest()
时,会创建一个新线程,该线程将在后台实际发送请求。该线程保持对加载器的引用,以便在加载完成时可以调用load complete函数。因此,加载器将始终由某个线程引用,而不是您现在所在的线程。
答案 1 :(得分:1)
没有。只要URLLoader包含仍在某处引用的回调(在这种情况下,它仍然由Javascript引擎/ JVM /引用,因为引擎必须稍后调用它。
答案 2 :(得分:0)
根据我的经验,不会收集URLLoader
或Loader
等活动加载程序对象(当它处于活动状态时)。
然而,一个不容错过的重点是,这是一种可观察到的行为,充其量,但它没有记录(至少,据我所知;我可能是错的)。
所以,尽管玩家使用内部机制来实现它(无论是创建新线程,使用集中式全局连接池等等),我认为你不应该依赖于此,因为你是将代码绑定到实现细节(同样,如果记录此行为,则不适用!)。
另外,正如我在评论中提到的,如果您在代码中使用它,则可以收集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');
}