参见 [ Solution ]
FileReference.load();
没有卸载的功能,就像有new Loader().unload();
一样。
必须是 Flash 的“BUG”或 FileReference
需要改进,输入新版本添加这样的函数:FileReference.unload();
还是我弄错了并且存在解决方案?
我试图将“NULL”设置为 FileReference
类型的变量,但显然这不适用于使用 GC(垃圾收集器)的 Flash,但这不是问题的重点.
问题是使用new FileReferenceList
加载多个文件时需要大量内存,但我无法在处理后释放内存。
如何在使用FileRerence
后释放内存?
查看我的代码:
主.as
package {
import com.mainpackage.LoaderTestCase;
import flash.net.FileReferenceList;
import flash.net.FileReference;
import flash.net.FileFilter;
import flash.events.Event;
import flash.display.MovieClip;
public class Main extends MovieClip {
private var listFiles:Array;
private var allTypes:Array;
private var fileRef:FileReferenceList;
private var test:int;
public function Main()
{
test = 0;
listFiles = [];
allTypes = [];
fileRef = new FileReferenceList();
fileRef.addEventListener(Event.SELECT, select);
fileRef.browse(allTypes);
}
private function select(e:Event):void
{
listFiles = fileRef.fileList;
for(var i:uint=0, j:uint=listFiles.length; i<j; i++)
{
insert(i);
}
}
private function insert(c:int):void
{
var fire:LoaderTestCase = new LoaderTestCase(listFiles[c]);
fire.destroy(function():void
{
//Delete LoaderTestCase after timeout ???
fire = null;
test++;
if(test>=listFiles.length) {//Remove FileReference
fileRef.removeEventListener(Event.SELECT, select);
fileRef = null;
for(var i:uint=0, j:uint=listFiles.length; i<j; i++) {
listFiles[i] = null;
}
listFiles = null;
trace("Clear memory");
}
});
}
}
}
LoaderTestCase.as
package com.mainpackage
{
import flash.net.FileReference;
import flash.events.Event;
import flash.display.Loader;
public class LoaderTestCase
{
private var file:FileReference;
private var loader:Loader;
private var callback:Function;
public function LoaderTestCase(e:FileReference)
{
file = e;
trace("OPEN: " + file.name);
file.addEventListener(Event.COMPLETE, loadFile);
file.load();
e = null;
}
public function loadFile(e:Event):void
{
file.removeEventListener(Event.COMPLETE, loadFile);
trace("LOAD: " + file.name);
file = null;
e = null;
callback();
}
public function destroy(a:Function):void
{
callback = a;
}
}
}
最佳答案
在清空监听对象之前删除事件监听器。
您可以使用弱引用让监听器在对象被垃圾收集时被删除。
object.addEventListener( ......, ......., false, 0, true );
例如,在您的 LoadFile 函数中:
...
LoadFile(file);
}
});
...
应该是:
...
LoadFile(file);
}
}, false, 0, true );
...
否则您将不得不手动删除它们。
为此,您需要将事件处理程序移动到新的命名函数中。
此外,您还需要一个数组来存储对监听器和监听对象的引用,以便能够在不再需要监听器之后和清空监听对象之前删除监听器。
请注意:
当您测试它并观察当前内存使用情况时,请确保在您认为内存使用情况现在应该已经下降但实际上没有下降时强制垃圾收集器。
GC 会在需要时启动,但不一定是在某些东西在卸载时被清零之后启动。
需要说明的是,我只是在谈论在开发/测试期间强制执行 GC。
关于actionscript-3 - 使用 FileRerence 后如何释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22738221/