这有点长 - 不知道是否有人会费心去阅读它(不知道我是否会这样做),但是在一天之内一直在打击我。
我遇到的问题是,我创建的一系列对象中的第一个并没有被释放。我正在使用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类 - 应该吗?)
答案 0 :(得分:1)
但是如果它没有扩展任何现有的as3或flex类,你怎么能把它添加到舞台上?它应该扩展DisplayObject或它的后代。 initialize =“”除了添加Eventlistener之外别无其他。所以你在初始化后删除它吗?如果没有,你可以引用你的第一个Rad_XF-Object,所以你不能删除它。