Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как правильно удалять Child -ов из памяти (http://www.flasher.ru/forum/showthread.php?t=183001)

Isfet 09.08.2012 07:10

Как правильно удалять Child -ов из памяти
 
Допустим есть Sprite, в который addChild-ом добавлены много экземпляров разных классов.
как правильно удалить из не всех детей
Код AS3:

while(this.spr1.numChildren>0){
    this.spr1.removeChildAt(0);
}

это понятно, но при утом мы удаляем только визуально со сцены, но как я знаю они все равно остаются в памяти, как затем удалять из из памяти. Если сделать такую манипуляцию this.spr1 = null а потом создать спрайт заного, дети удалятся?
Но это мне кажется что это какой то костыль.
Подскажите плиз как удалять детей бесследно.

Srednas 09.08.2012 08:30

Визуально удалить это
Код AS3:

this.spr1.getChildAt(0).visible = false;

А removeChild в справке описан так:
Цитата:

Удаляет дочерний DisplayObject из заданной позиции индекса в списке потомков DisplayObjectContainer. Свойство parent удаленного потомка получает значение null, а сам объект очищается, если нет других ссылок на потомка. Позиции индекса экранных объектов, расположенных над потомком в DisplayObjectContainer уменьшаются на 1.

Сборка мусора — это процесс, с помощью которого проигрыватель Flash Player перераспределяет неиспользуемую память. Когда на переменную или объект больше нет ссылок или он хранится в другом месте, сборщик мусора очищает и утилизирует память, которую он занимал, при условии отсутствия ссылок


Isfet 09.08.2012 08:55

ну вот допустим код
Код AS3:

var sprite1:Sprite  = new Sprite();
for (var i:int = 0;i<5;i++){
    var obj = new ObjectClass();
    sprite1.addChild(obj);
}
 
while(this.sprite1.numChildren>0){
    this.sprite1.removeChildAt(0);
}
 
после этого как я понимаю ссылки на объекты obj  остаются, как очистить память от них.
мусорщик ух не уберет.


Srednas 09.08.2012 09:26

Цитата:

Сообщение от Isfet (Сообщение 1091517)
после этого как я понимаю ссылки на объекты obj остаются, как очистить память от них.
мусорщик ух не уберет.

Почему вы так считаете?

Isfet 09.08.2012 10:06

ну как видно из документации мусорщик не удаляет объекты на которые еще сохранились ссылки.
а на эти объекты сохранятся ссылки если создавать их в функции?

ChuwY 09.08.2012 11:15

Цитата:

Сообщение от Isfet (Сообщение 1091517)
ну вот допустим код
Код AS3:

var sprite1:Sprite  = new Sprite();
for (var i:int = 0;i<5;i++){
    var obj = new ObjectClass();
    sprite1.addChild(obj);
}
 
while(this.sprite1.numChildren>0){
    this.sprite1.removeChildAt(0);
}
 
после этого как я понимаю ссылки на объекты obj  остаются, как очистить память от них.
мусорщик ух не уберет.


Ссылка останется только на sprite1. И то не ясно, где описана эта переменная.
Если не поле класса и наружу ссылок не выдавали, то ничего в памяти не останется.
Как же вы интересно обратитесь к obj после выполнения кода этой функции? :)

Isfet 09.08.2012 11:43

обращусь по слушателю мыши, прописанному в классе.
спасибо за ответы

ChuwY 09.08.2012 16:39

Про слушатели вы не упоминали.
Отписываться надо.

kackbip 09.08.2012 17:39

Цитата:

Сообщение от Isfet (Сообщение 1091511)
но при утом мы удаляем только визуально со сцены, но как я знаю они все равно остаются в памяти, как затем удалять из из памяти.

Из памяти вы во флэше ничего никогда не удаляете(за редким исключением). Есть простое правило - нужно чтобы на объект не было ссылок. Тогда сборщик мусора сможет удалить объект из памяти. Если вы добавляете визуальный объект в контейнер, ссылка на визуальный объект сохраняется в контейнере. Когда вы удаляете объект из контейнера - ссылка тоже зануляется. И если это была единственная связь с объектом, он может быть удален сборщиком мусора.
Также ссылки на объекты порождаются в результате подписки на события. Еще ссылки вы можете создать вручную - поля класса, объекта, переменные и т.д.
Про локальные переменные тоже надо упомянуть - локальные переменные(ссылки на объекты) удаляются после завершения выполнения функции или метода. Соответственно, нет ссылки - объект доступен сборщику мусора.
Цитата:

Сообщение от Isfet (Сообщение 1091511)
Если сделать такую манипуляцию this.spr1 = null а потом создать спрайт заного, дети удалятся?
Но это мне кажется что это какой то костыль.
Подскажите плиз как удалять детей бесследно.

Это не костыль. Это просто не сработает. Занулеине ссылки на spr1 ничего не делает с самим объектом и не удаляет его из дерева отображения. Вобще нет смысла в данном действии.

Isfet 11.08.2012 06:49

тоесть если в экземпляре класса есть хоть одна паблик переменная или функция к которой есть обращение , или слушатель или где нибудь еще храниться ссылка на этот укземпляр , то мусорщик его не соберет?


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

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