Форум 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=203184)

Ralph_DiMarko 05.09.2013 19:23

Полное удаление объекта
 
Всем привет. Столкнулся в проекте с проблемой удаления объекта со сцены, вроде как удалил его, но внутренний контент все равно присутствует, слышны звуки, делает запросы к серверу, в общем ощущение что не удалил а сделал visible=false (хотя removeChild почти так и делает).
Покопавшись в проекте выхода не нашел, поиски тоже не дали результата, делаю самый простой эксперимент:
открываю чистую флешку, в библиотеке мувик, на 5ом кадре мувика код
Код AS3:

trace("я все еще здесь")

Далее динамически добавляю его на сцену и тут же удаляю:
Код AS3:

var m:MovieClip = new symbol();
addChild(m);
removeChild(m);

Но trace не прекращается никогда. Что не так? Ссылка осталась? Хорошо делаю так чтобы не было ссылок:
Код AS3:

function create()
{
        var m:MovieClip = new symbol();
        addChild(m);
        removeChild(m);
}
create();

Но trace не прекращается никогда... Подскажите пожалуйста.

KumoKairo 05.09.2013 19:33

Удаление объекта со сцены - это не удаление самого объекта. пока на ваш var m:MovieClip = new symbol(); есть ссылка, то есть пока m указывает на объект класса symbol (названия классов лучше с большой буквы), объект не удалится.
Более того, если занулить ссылку, m = null, объект удалится из памяти не сразу - он будет существовать в куче пока до него не доберется сборщик мусора. Такой код называется управляемым.

Поищите еще информации про сборщик мусора и правила работы с объектами в AS3

Ralph_DiMarko 05.09.2013 20:21

Материала начитался везде одно и тоже, меня интересует проблема с примером, который я привел. Здесь ведь нету ни ссылок ни слушателей.

KumoKairo 05.09.2013 20:40

Цитата:

Более того, если занулить ссылку, m = null, объект удалится из памяти не сразу - он будет существовать в куче пока до него не доберется сборщик мусора.
Цитата:

Материала начитался везде одно и тоже,
а покажите что вы читали? Мне не верится, если честно, что там такие примеры не приводились

amesqit 05.09.2013 20:58

В таких случаях внутри удяляемого объекта слушается событие Event.REMOVED_FROM_STAGE, в обработчике описывается деактивация объекта, выключение музыки, отписывание от всяких ненужных событий и прочие действия, для того чотбы он не дергался, а спокойненько ждал сборщик мусора. Есть еще не очень хороший вариант при котором сборщик мусора можно вызвать самому, описан о тут

expl 06.09.2013 16:37

Цитата:

Но trace не прекращается никогда... Подскажите пожалуйста.
Если ещё где-нибудь не завязались(подписка функции принадлежащей этому мувику на внешний диспетчер тоже считается завязкой) - прекратится когда-нибудь

Если бы этот трейс был не в кадрах, а например в onEnterFrame, то во избежании таких казусов во время ожидания GC надо было бы отписать этот onEnterFrame при удалении со стейдж.
А так, если оно что-то в кадре делает - ну флаг сделайте и при удалении со стейдж выставляйте в false - при добавлении на стейдж - в true.

Как проверить, что Вы впринципе не оставили ссылок на объект?
- после уборки со стейджа написать System.gc() и запустить флешку в дебажном флеплеере - трейсы должны прекратиться (в релизе оставлять нельзя - падать будет, на худой конец директивами компилятора обернуть)
- посмотреть профайлером

Ralph_DiMarko 06.09.2013 20:39

Беда в том что эксперимент проводил во flash cs, во FD да, можно это все отследить как то.
В целом что понял - адоб реально не доделал плеер, это вроде логично если удалил объект со сцены то он тебе совсем не нужен, не смотря на то что есть подписчики, внутри объекта есть какие то другие объекта воспроизводящие звуки, видео или просто картинки, или все же есть такие ситуации когда объект нужно удалить но все ссылки внутренний контент и т.д. должно остаться? Приведите пример если кто делал такое нарочно.
Клипал проект пол года и тут вдруг понадобилось чтобы была возможность загрузка-выгрузка-загрузка, пару раз туда-сюда и 500 метров памяти готово, вот я и попал по неопытности :(


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

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