Удалить сам класс AS3

#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