【发布时间】:2014-03-29 23:22:04
【问题描述】:
见 [Solution]
FileReference.load();没有卸载功能,就像new Loader ().unload();一样。
必须是来自 Flash 的“BUG”或FileReference 需要改进,输入新版本添加这样的函数:FileReference.unload();
还是我弄错了,存在解决方案?
我尝试将“NULL”设置为FileReference 类型的变量,但显然这不适用于Flash 与GC(垃圾收集器)一起使用,但这不是问题的重点。
问题是使用new FileReferenceList 加载多个文件时需要大量内存,但处理后我无法释放内存。
使用FileRerence后如何释放内存?
查看我的代码:
Main.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;
}
}
}
【问题讨论】:
-
你试过
unloadAndStop(true)吗? -
@SeanFujiwara 不起作用
-
System.gc() 仅用于测试/调试
-
@san.chez 我做了你说的一切(忽略“System.gc”),但似乎没有任何效果。
-
您是否尝试过弱引用或手动删除事件监听器?请仔细阅读我的回答
标签: actionscript-3 flash memory actionscript filereference