alexxus
06.05.2012, 01:36
Доброго времени суток. Нуждаюсь в совете знатоков. Для Flash AS3 приложения необходимо было создать окно-сообщение. Под это дело написал класс CMessageBox
Т.к. сообщение может вызываться из любых классов программы, то очень напрягало создавать в каждом классе переменную-член CMessageBox. я создал статический массив в классе CMessageBox, элементами которого являются члены класса CMessageBox. Вот краткий листинг:
//-------------------------------------------------------------------------
public class CMessageBox extends MovieClip {
private static var app:Stage;//ссылка на родитель-контейнер
private static var mList:Array = new Array();//список созданных окон
private static var idCounter:int =0;//счетчик созданных окон, как уникальный id
//---------------------------------------------------------------------
//Указываем родителя на этапи инициализации приложения---------------
public static function setStage(obj:Stage):void {
app = obj;
}
//---------------------------------------------------------------------
// Создать окно--------------------------------------------------------
//---------------------------------------------------------------------
public static function showMessage(mess:String):void {
if(app!=null)
{
mList.push(new CMessageBox(mess));
}else
trace("Не указано родительское окно!");
}
//конструктор----------------------------------------------------------
public function CMessageBox(mess:String) {
idCounter ++;
this.name = "mess"+ idCounter.toString();
bClose.addEventListener(MouseEvent.CLICK, onCloseClick);
this.txt.text = mess;
//отображаем------------
app.addChild(this);
}
//---------------------------------------------------------------------
private function onCloseClick(e:MouseEvent):void {
bClose.removeEventListener(MouseEvent.CLICK, onCloseClick);
if(this.parent)
this.parent.removeChild(this);
deleteMessage(this.name);
}
// Удалить окно--------------------------------------------------------
private static function deleteMessage(pName:String):int {
for(var i:int=0; i< mList.length;i++)
{
if( CMessageBox(mList[i]).name == pName )
mList.splice(i,1);
return 1;
}
return 0;
}
//------------------------------------------------------------------------
}
По-поводу алгоритма удаления - можно также было использовать app.getChildByName, либо использовать ассоциативный массив, не суть. Данная реализация мне приглянулась весьма удобной, но у меня есть сомнения по-поводу очистки памяти. Если какой-нибудь объект массива не будет принудительно заNullен, он заторчит в памяти? Как GC работает со статическими переменными? Вообще - разумна ли такая реализация?
В данном примере сообщения удаляются по закрытию, и вроде как все под контролем. Но руки чешутся использовать такой подход в других вопросах. Например, есть класс NPC, хочу в этот же класс влепить статический список членов этого класса, т.к. члены NPC тесно взаимодействуют с другими членами этоого же класса...
Много думал, писал под пиво... спасибо за внимание, жду ваших ответов и рекомендаций.
Т.к. сообщение может вызываться из любых классов программы, то очень напрягало создавать в каждом классе переменную-член CMessageBox. я создал статический массив в классе CMessageBox, элементами которого являются члены класса CMessageBox. Вот краткий листинг:
//-------------------------------------------------------------------------
public class CMessageBox extends MovieClip {
private static var app:Stage;//ссылка на родитель-контейнер
private static var mList:Array = new Array();//список созданных окон
private static var idCounter:int =0;//счетчик созданных окон, как уникальный id
//---------------------------------------------------------------------
//Указываем родителя на этапи инициализации приложения---------------
public static function setStage(obj:Stage):void {
app = obj;
}
//---------------------------------------------------------------------
// Создать окно--------------------------------------------------------
//---------------------------------------------------------------------
public static function showMessage(mess:String):void {
if(app!=null)
{
mList.push(new CMessageBox(mess));
}else
trace("Не указано родительское окно!");
}
//конструктор----------------------------------------------------------
public function CMessageBox(mess:String) {
idCounter ++;
this.name = "mess"+ idCounter.toString();
bClose.addEventListener(MouseEvent.CLICK, onCloseClick);
this.txt.text = mess;
//отображаем------------
app.addChild(this);
}
//---------------------------------------------------------------------
private function onCloseClick(e:MouseEvent):void {
bClose.removeEventListener(MouseEvent.CLICK, onCloseClick);
if(this.parent)
this.parent.removeChild(this);
deleteMessage(this.name);
}
// Удалить окно--------------------------------------------------------
private static function deleteMessage(pName:String):int {
for(var i:int=0; i< mList.length;i++)
{
if( CMessageBox(mList[i]).name == pName )
mList.splice(i,1);
return 1;
}
return 0;
}
//------------------------------------------------------------------------
}
По-поводу алгоритма удаления - можно также было использовать app.getChildByName, либо использовать ассоциативный массив, не суть. Данная реализация мне приглянулась весьма удобной, но у меня есть сомнения по-поводу очистки памяти. Если какой-нибудь объект массива не будет принудительно заNullен, он заторчит в памяти? Как GC работает со статическими переменными? Вообще - разумна ли такая реализация?
В данном примере сообщения удаляются по закрытию, и вроде как все под контролем. Но руки чешутся использовать такой подход в других вопросах. Например, есть класс NPC, хочу в этот же класс влепить статический список членов этого класса, т.к. члены NPC тесно взаимодействуют с другими членами этоого же класса...
Много думал, писал под пиво... спасибо за внимание, жду ваших ответов и рекомендаций.