Flash 使用Loader而不创建引用
我一直在使用加载器将很多图像上传到我的movieclip中。但我知道的唯一方法是加载内容,添加一个事件侦听器,然后使用对加载程序的引用,在处理程序中等待它完成任务,如下所示Flash 使用Loader而不创建引用,flash,actionscript-3,garbage-collection,flash-cs4,Flash,Actionscript 3,Garbage Collection,Flash Cs4,我一直在使用加载器将很多图像上传到我的movieclip中。但我知道的唯一方法是加载内容,添加一个事件侦听器,然后使用对加载程序的引用,在处理程序中等待它完成任务,如下所示 protected function loadImage(imageDir:String):void { loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event
protected function loadImage(imageDir:String):void
{
loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.INIT,tilesLoadInit);
loader.load(new URLRequest(imageDir));
}
private function tilesLoadInit e:Event):void {
sprite = Bitmap(loader.content).bitmapData;
//load in xml file for map
xmlToArray();
}
我正在努力使我的代码更简洁。我宁愿在方法中本地调用我的loader:loader类,而不是在类中进行引用。有没有办法在我的处理程序的Event.INIT参数中检索该加载程序对象
一般来说,精灵也是如此。假设我创建了一个按钮。用户单击它并调用处理程序。无论如何,我都可以检索该按钮,通过事件参数将其从阶段中移除,而不是创建类引用来移除它们
我想这样做,使垃圾收集更容易。因此,不要创建所有对象的类引用。我宁愿在本地调用它们,这样当我将它们从舞台上移除时,垃圾收集器将处理它们 您可以在事件侦听器中使用
event.currentTarget
来获取对注册事件侦听器的对象的引用
private function localFunc():void
{
var btn:Button = new Button();
btn.addEventListener(MouseEvent.CLICK, onClick);
}
private function onClick(e:MouseEvent):void
{
//e.currentTarget is typed as Object: in order to assign it to a
//variable of type Button, you must cast it accordingly.
var btn:Button = Button(e.currentTarget);
}
在加载程序事件的情况下,currentTarget
将是关联的LoaderInfo
对象。LoaderInfo有一个指向原始loader
对象的loader
属性
private function tilesLoadInit(e:Event):void
{
var linfo:LoaderInfo = LoaderInfo(e.target);
var ldr:Loader = linfo.loader;//this is the Loader you wanted
}
target
和currentTarget
属性在LoaderInfo事件中相同,但在按钮和其他显示对象中可能不同。例如,当您将click event listener添加到按钮并单击作为按钮子项的文本字段时,event.target
将是文本字段,event.currentTarget
将是按钮。基本上,target
将包含触发事件的确切对象,currentTarget
将是当前正在执行的事件侦听器注册到的对象
至于垃圾收集,您必须先从相应的对象中删除事件侦听器,然后垃圾收集器才能将其清除。或者,通过在方法中设置第五个参数
true
,可以在添加事件侦听器时使用弱引用。垃圾收集器在检查对象是否符合垃圾收集的条件时,不会对弱引用计数
但是,如果对局部变量使用弱引用,如果对象没有更多的引用,那么一旦对象超出范围(即方法返回时),它可能会被GC’ed,并且事件侦听器可能根本不会被调用:这不是按钮的问题,因为在返回之前,您会将它们添加到显示列表中,从而产生了对它的强烈引用
使用
Event.COMPLETE
而不是Event.INIT
读取内容。发件人:
complete
-当文件加载完成时,由关联的LoaderInfo
对象调度
init
-当加载的SWF文件的属性和方法可访问时,由关联的LoaderInfo
对象调度。init
事件始终位于complete
事件之前