代码之家  ›  专栏  ›  技术社区  ›  Ólafur Waage

我是否正确执行AS3引用清理?

  •  0
  • Ólafur Waage  · 技术社区  · 14 年前

    在fla文件的一个帧(我们称之为帧2)中,我加载一些xml文件,然后将数据发送到一个在该帧中初始化的类中,这个类创建一些计时器和侦听器。

    这应该是重复,因为我需要经常,所以我需要清理的参考正确,我想知道我是否做得正确。

    world.removeChild(Background); // world is the parent stage
    Background = null;
    

    对于其他类的实例,我这样做。

    Players[i].cleanUp(world); // do any cleanup within the instanced class
    world.removeChild(PlayersSelect[i]);
    

    对于事件侦听器,我这样做。

    if(Background != null)
    {
        Background.removeEventListener(MouseEvent.CLICK, deSelectPlayer);
    }
    

    if(Timeout != null)
    {
        Timeout.stop();
        Timeout.removeEventListener(TimerEvent.TIMER, queueHandler);
        Timeout.removeEventListener(TimerEvent.TIMER_COMPLETE, queueCompleted);
        Timeout = null;
    }
    

    对于图书馆的图片,我是这样做的

    if(_libImage!= null)
    {
        s.removeChild(Images._libImage); // s is the stage
        _libImage= null;
    }
    

    对于主时间线中的类本身,我这样做

    Frame2.removeEventListener("Done", IAmDone);
    Frame2.cleanUp(); // the cleanup() does all the stuff above
    Frame2= null;
    

    我清理得对吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   jordanx    14 年前

    if(item)
    {
       if(item.hasEventListener(MouseEvent.CLICK))
       {
          item.removeEventListener(MouseEvent.CLICK,doSomething);
       }
    }
    

    我在移除孩子之前做了一个类似的检查:

    if(item)
    {
       if(this.contains(item))
       {
          this.removeChild(item);
          item.destroy()//or whatever you code is to clear that element of its own dependencies.
          item = null;
       }
    }
    
        2
  •  0
  •   MasterOfObvious    14 年前

    如果您想让垃圾收集器在您将对象设置为null之后清理它们。 然后,当您添加eventListener并使用弱引用时,这允许垃圾收集器在其值为null时收集它。 请参阅addEventListener函数的参数:

    addEventListener(type:String, 
                     listener:Function,
                     useCapture:Boolean = false, 
                     priority:int = 0, 
                     useWeakReference:Boolean = false)
    

    因此,要使引用不为空,必须将最后一个参数设置为false。

    addEventListener(MouseEvent.MOUSE_OVER, function(), false, 0, true);
    instead of
    addEventListener(MouseEvent.MOUSE_OVER, function());
    

    编辑: jordanx的例子是无效的,因为即使item为null,强引用仍然存在,并且null指针仍然可以发生。