Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вопрос по стиранию объектов. (http://www.flasher.ru/forum/showthread.php?t=183839)

zerAlex2 03.09.2012 03:29

Вопрос по стиранию объектов.
 
Если я создаю объекты в цикле и помещая их в массив, могу ли я через этот массив занулить экземпляр, или просто сотру данные из массива?
Код AS3:

for (var i:Number=0; i<10; i++)
{
var button:MovieClip=new myButton();
this.Container.addChild(button);       
ButtonsArray.push(button);//Добавить объект в массив
}
 
for (var i:Number=0; i<10; i++)
{       
ButtonsArray[i]=null;//Видимо, удалится ссылка, а как удалить экземпляр?
}


spirit2 03.09.2012 04:14

Код AS3:

for (var i:Number=0; i<10; i++)
{
Container.removeChild(button); //удаление с дисплей листа
ButtonsArray[i]=null; //удаление ссылки
}
//Когда придет GC, то сделает свое грязное дело, и удалит объект из памяти.


zerAlex2 03.09.2012 13:25

И откуда мне взять это (button)? Я ж написал, что это в цикле создаётся и в массив заносится. Их там несколько десятков, к какому именно вы отсылаете? Как обратиться к непосредственно экземпляру?

Хотя я делаю несколько иначе remove. У меня каждый объект имеет функцию destroy():
Код AS3:

public function destroy():void
{
 //Destroy button
 //Тут убиваю все ссылки и пр. в данном объекте       
 var i:int = this.numChildren;
 while(i--)
 {
  this.removeChild(getChildAt(i));
 }
 var someObj:Object=this.parent.getChildByName(this.name);
 this.parent.removeChild(someObj);               
 
}


RigidFlasher 03.09.2012 13:33

Цитата:

И откуда мне взять это (button)?
Например, можно сделать так
Код AS3:

for (var i:Number=0; i<10; i++)
{
Container.removeChild(ButtonsArray[i]); //удаление i-того мувиклипа со сцены
ButtonsArray[i]=null; //удаление ссылки
}


spirit2 03.09.2012 16:56

Ну да, конечно, ButtonsArray[i] в скобках. Не обратил внимание.

zerAlex2 03.09.2012 20:12

RigidFlasher, это ты таким способом занулишь сам экземпляр? Или всё-таки объект в массиве?

Isfet 03.09.2012 20:18

непонятная строка в вашей функции destroy
Цитата:

Код AS3:

           var someObj:Object=this.parent.getChildByName(this.name);
          this.parent.removeChild(someObj);


Код AS3:

this.parent.removeChild(this);


Korchy 03.09.2012 21:27

Цитата:

Сообщение от zerAlex2 (Сообщение 1094742)
RigidFlasher, это ты таким способом занулишь сам экземпляр? Или всё-таки объект в массиве?

Для того, чтобы понимать, с чем именно вы работаете в массиве - с объектом или с элементом массива, нужно запомнить магическую фразу: в AS все переменные сложнее простых типов передаются как указатели на объект. Т.е. когда вы заносите что-то в массив, вы заносите не объект, а указатель на него. Соответственно выполняются и действия с элементами массива.

RigidFlasher 04.09.2012 06:17

Код AS3:

ButtonsArray[i]=null; //удаление ссылки

Этой строчкой удаляется элемент массива, то есть указатель на объект, как уже было сказано сообщением выше. После этого, если на ButtonsArray[i] больше нет ссылок и на него не повешены слушатели события c сильными ссылками, то сборщик мусора удалит сам объект.

zerAlex2 04.09.2012 15:57

А-а-а... всё понял. ButtonsArray[i] будет единсвенной ссылкой на объект, т.к. var button:MovieClip будет многократно перезаписан еще при создании кнопок и удалён при выходе из функции... Все, теперь понял.

artcraft 04.09.2012 16:21

из вашего кода в первом посте топика видно что это не единственная ссылка на кнопку
вторя ссылка создаётся этой строчкой this.Container.addChild(button);
если вы занулите массив то на кнопку всё равно останется одна ссылка у контейнера


Часовой пояс GMT +4, время: 02:48.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.