PDA

Просмотр полной версии : Вопрос по стиранию объектов.


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

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

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

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

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)?
Например, можно сделать так
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

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




this.parent.removeChild(this);

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

RigidFlasher
04.09.2012, 06:17
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);
если вы занулите массив то на кнопку всё равно останется одна ссылка у контейнера