使用Loader而不创建引用

时间:2010-01-09 07:21:18

标签: flash actionscript-3 garbage-collection flash-cs4

我一直在使用加载器将很多上传图片上传到我的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参数中检索该加载器对象?

与Sprites相同。假设我创建了一个按钮。用户点击它并调用处理程序。无论如何我可以检索该按钮,通过Event参数将其从舞台中删除,而不是创建Class引用来删除它们。

我想这样做,以便更容易收集垃圾。所以不要创建所有对象的类引用。我宁愿在本地调用它们,所以当我从舞台上删除它们时,垃圾收集器会处理它们。

1 个答案:

答案 0 :(得分:1)

您可以在事件侦听器中使用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
}

targetcurrentTarget属性在LoaderInfo事​​件中是相同的,但在按钮和其他显示对象中可以不同。例如,当您将click事件侦听器添加到按钮并单击作为按钮子项的文本字段时,event.target将是文本字段,event.currentTarget将是按钮。基本上,target将包含触发事件的确切对象,currentTarget将是当前正在执行的事件侦听器所注册的对象。


对于垃圾收集,您必须先从相应的对象中删除事件侦听器,然后垃圾收集器才能将其扫除。或者,您可以在添加事件侦听器时使用弱引用,方法是在addEventListener方法中设置第五个参数true。在检查对象是否符合垃圾回收条件时,垃圾收集器不计算弱引用。

但是如果你对局部变量使用弱引用,那么一旦它超出范围(即方法返回时),该对象可能会得到GC,如果它没有任何对它的引用,并且根本不会调用事件监听器:这不是按钮的问题,因为在返回之前将它们添加到显示列表中,从而创建对它的强引用。


使用Event.COMPLETE代替Event.INIT来阅读内容。来自livedocs

  

complete - 在文件加载完成后由关联的LoaderInfo对象调度。

     

init - 当可以访问加载的SWF文件的属性和方法时,由关联的LoaderInfo对象调度。 init事件始终位于complete事件之前。