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

Apache flex 无法仅删除一系列对象中的第一个,apache-flex,actionscript-3,Apache Flex,Actionscript 3,这有点长-不知道是否有人会费心去读它(不知道我是否会),但我已经为此捶了一天多的头 我有一个问题,我创建的一系列对象中的第一个从未被释放。我正在使用LocalConnectionHack等从对象中删除事件侦听器,它可以立即释放除第一个对象之外的任何对象 背景如下: 我最初有一个应用程序,它是一个mxml文件,主要由纯actionscript 3的一个巨大的mx:Script块组成。应用程序是通过一个xml文件配置的,该文件的名称在启动时从html文件传递到该文件中 我所做的更改是,当用户单击指向

这有点长-不知道是否有人会费心去读它(不知道我是否会),但我已经为此捶了一天多的头

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

背景如下:

我最初有一个应用程序,它是一个mxml文件,主要由纯actionscript 3的一个巨大的mx:Script块组成。应用程序是通过一个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对象:

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;
父应用程序是mxml应用程序。rad_xf_prev是最后被删除的前一个rad_xf对象

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


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

但是如果它没有扩展任何现有的as3或flex类,您如何将其添加到该阶段?它应该扩展DisplayObject或它的后代。
initialize=“”只意味着添加一个Eventlistener。那么,在初始化之后是否删除它?如果没有,您有您的第一个Rad_XF-Object的引用,因此无法删除它。

我读过,但没有提供帮助。您在应用程序上使用过Flex Profiler吗?您如何知道第一个对象从未被删除?这又有什么关系呢?每个对象都保存着整个应用程序的所有数据——通常是10-20兆字节。我没有访问flex profiler的权限。其他人也推荐了pblabs profiler,我试过了,但还没有运行。只是让pblabs profiler正常工作-仅适用于FP 10 evidentlyRad_XF的成员包括mx:Canvas和mx:Text,应用程序将这些成员添加为子成员。但是你关于初始化的另一个评论只是添加了一个新的eventlistener(需要删除)——我最初认为你已经了解了一些事情,但正如前面提到的,我确实尝试过用各种其他方式初始化第一个Rad_XF,并得到了相同的结果。不管怎样,您认为Rad_XF的哪个成员函数通过调用initialize=“{new Rad_XF(this);}”被添加为事件侦听器。谢谢你的反馈。但我会再看一看编译器为mxml生成的actionscript,只是为了检查它没有按照你的建议执行。但例如,我相信我初始化了RadXF中的一个静态函数,它只启动了一个计时器,计时器处理程序实际上创建了第一个Rad_XF,并且具有相同的结果(无法删除初始Rad_XF)