我有像这样的as3类
package {
import Global;
import flash.display.MovieClip;
import flash.events.*;
public class Alert extends MovieClip {
public function Alert(alertTitle:String, alertText:String, alertButton:String = "OK") {
alert_title.text = alertTitle;
alert_text.text = alertText;
alert_button.button_text.text = alertButton;
this.x = Global.stage.stageWidth/2;
this.y = Global.stage.stageHeight/2;
Global.stage.addChild(this);
alert_button.addEventListener(MouseEvent.CLICK, Close);
}
public function Close(e:MouseEvent){
this.parent.removeChild(this);
alert_button.removeEventListener(MouseEvent.CLICK, Close);
}
}
}
我使用函数Close()删除类本身,但我发现它不会释放内存。有没有办法完全删除它并释放使用过的内存?
抱歉我的英语不好。
答案 0 :(得分:2)
它是内存管理的,因此不会立即释放对象。垃圾收集器运行后,如果没有任何内容引用Alert,则它将被释放。
答案 1 :(得分:1)
Flash Player使用垃圾收集来释放对象使用的内存。
https://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html
通常,检查内存时不会立即反映删除对象。 Flash Player运行时将确定执行重新分配的适当时间。
答案 2 :(得分:0)
public function Close(e:MouseEvent){
this.parent.removeChild(this);
alert_button.removeEventListener(MouseEvent.CLICK, Close);
alert_button=null;
}
它可能无助于您正在寻找的即时内存重新分配,但它将允许GC引擎更快地找到它。
这里还有另一种想法 你拥有的这个警报课程非常小,除非你在舞台上有几百个,你可能根本不会注意到内存的急剧变化
答案 3 :(得分:0)
如果你扩展了MovieClip,你应该为测试添加一些大的bitmapData,当GC删除对象你肯定会看到几个或更多的kb改变。
答案 4 :(得分:0)
首先,您需要确保在单击关闭
后没有任何内容链接到此类就垃圾收集而言,你可以使用System.gc()作为调试播放器或AIR应用程序,这里是它的文档 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/System.html#gc%28%29
您也可以使用此代码强制进行垃圾回收
try {
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
} catch (e:*) {}
// the GC will perform a full mark/sweep on the second call.
这里有关于它的更多信息http://gskinner.com/blog/archives/2006/08/as3_resource_ma_2.html