无法仅删除一系列对象中的第一个

时间:2010-09-22 22:20:10

标签: flex actionscript-3

这有点长 - 不知道是否有人会费心去阅读它(不知道我是否会这样做),但是在一天之内一直在打击我。

我遇到的问题是,我创建的一系列对象中的第一个并没有被释放。我正在使用localconnection hack等从对象中删除事件侦听器,它可以立即释放除第一个之外的任何对象。

以下是背景资料:

我最初有这个应用程序是一个mxml文件,主要由一个巨大的mx:纯动作脚本3的脚本块组成。该应用程序是通过一个xml文件配置的,其名称在启动时从html文件传递给它。

我做的更改是当用户点击指向xml文件的超链接时,允许随后加载新的xml文件(并重新配置应用程序)。为了实现这一点,我从mxml文件中取出了上面提到的整个代码块,并将它放在自己的类中,放在.AS文件中。现在主要的mxml文件非常简短 - 它只是在mxml应用程序声明中实例化这个新类:

initialize="{new Rad_XF(this);}"  

这个新的Rad_XF对象包含以前在mxml文件中找到的所有旧代码。

现在,如果用户单击指向有效xml文件的链接,现有的Rad_XF对象将创建一个新的Rad_XF对象,新的Rad_XF对象在初始化后将删除旧的Rad_XF对象。这可以删除任何以前的Rad_XF对象 - 除了第一个(如上面初始化的那个)。

以下是Rad_XF中的代码,用于在用户点击链接时创建新的Rad_XF对象:

private function txt_linkHandler(e:TextEvent):void  { 
  if (getExt(e.text).toUpperCase() == "XML")
    new Rad_XF(parent_app,this,e.text);  
  else 
    navigateToURL(new URLRequest(e.text),"_self");
} 

Rad_XF中的代码用于销毁之前的Rad_XF对象:

 if (rad_xf_prev) {

    parent_app.removeChild(rad_xf_prev.CanvasSB);   

    parent_app.removeEventListener("enterFrame",rad_xf_prev.app_enterframe);
    parent_app.removeEventListener("mouseFocusChange",rad_xf_prev.repeat_end);
    parent_app.removeEventListener("activate",rad_xf_prev.app_activate_handlr);
    parent_app.removeEventListener("deactivate",rad_xf_prev.app_activate_handlr);
    parent_app.removeEventListener("mouseMove",rad_xf_prev.mouse_handlr);
    parent_app.removeEventListener("click",rad_xf_prev.mouse_handlr);
    parent_app.removeEventListener("doubleClick",rad_xf_prev.mouse_handlr);

    rad_xf_prev = null;

    try { 
       new LocalConnection().connect('foo'); 
       new LocalConnection().connect('foo'); 
    } catch (e:*) {} 

  }

在第一个对象和所有后续对象之间没有任何差别,无论是有意的还是迄今为止可辨别的,但是第一个对象将不会被删除,但后面的对象将不会被删除。 (我在System.TotalMemory调用中附上了上面的块以确认这一点。)第一个对象在mxml文件中初始化,但我尝试将其移动到AS文件 - 没有区别。

以下是Rad_XF构造函数的前几行:

public function Rad_XF(parent_app:Application, rad_xf_prev:Rad_XF=null, fnCFG:String = null):void {

  this.parent_app = parent_app;             
  this.rad_xf_prev = rad_xf_prev;

parent_app是mxml应用程序。 rad_xf_prev是最后被删除的前一个rad_xf对象。

只是不知道是否有人会费心阅读并有一些可行的想法。或者认为写这篇文章的过程可能会给我一些额外的想法,但事实并非如此。

(注意:Rad_XF不扩展任何现有的actionscript或flex类 - 应该吗?)

1 个答案:

答案 0 :(得分:1)

但是如果它没有扩展任何现有的as3或flex类,你怎么能把它添加到舞台上?它应该扩展DisplayObject或它的后代。 initialize =“”除了添加Eventlistener之外别无其他。所以你在初始化后删除它吗?如果没有,你可以引用你的第一个Rad_XF-Object,所以你不能删除它。