#flash #actionscript-3 #actionscript
#flash #actionscript-3 #actionscript
Вопрос:
У меня есть класс 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() для удаления самого класса, но я заметил, что это не освобождает память. Есть ли какой-либо способ полностью удалить его и освободить используемую память?
Извините за мой плохой английский.
Ответ №1:
Он управляется памятью, поэтому объекты не будут освобождены немедленно. После запуска сборщика мусора, если ничто не ссылается на предупреждение, оно будет освобождено.
Ответ №2:
Flash Player использует сборку мусора для освобождения памяти, используемой объектами.
https://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html
Как правило, удаление объекта не будет немедленно отражено при проверке памяти. Среда выполнения Flash Player определит подходящее время для выполнения освобождения.
Ответ №3:
вас тоже не хватает.
public function Close(e:MouseEvent){
this.parent.removeChild(this);
alert_button.removeEventListener(MouseEvent.CLICK, Close);
alert_button=null;
}
Это может не помочь мгновенному перераспределению памяти, которое вы ищете, но это позволит движку GC быстрее найти его.
Также еще одна мысль здесь
Этот класс оповещений, который у вас есть, чрезвычайно мал, и если у вас не будет нескольких 100 из них на сцене, вы, вероятно, вообще не заметите резких изменений в памяти
Ответ №4:
Если вы расширяете MovieClip, вам следует для тестов добавить немного больших BitmapData внутри, когда GC удаляет объект, вы наверняка увидите несколько или более изменений в КБ.
Ответ №5:
Сначала вам нужно убедиться, что ничего не связано с этим классом после нажатия кнопки закрыть
Что касается сборки мусора, вы можете использовать System.gc() для проигрывателя отладки или для приложения AIR, вот документация для него http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/System.html#gc()
Вы также можете использовать этот код для принудительной сборки мусора
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