Flash 使用Loader而不创建引用

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

我一直在使用加载器将很多图像上传到我的movieclip中。但我知道的唯一方法是加载内容,添加一个事件侦听器,然后使用对加载程序的引用,在处理程序中等待它完成任务,如下所示

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
事件之前