Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   removeChild и сборка мусора (http://www.flasher.ru/forum/showthread.php?t=138467)

sinya 08.04.2010 18:27

removeChild и сборка мусора
 
Привет!

Хочу уточнить, как навсегда убрать мувиклип со сцены и из памяти. В учебниках рассказывают, что если нет слушателей и ссылок на обьект, то после removeChild(obj) он уходит в небытие.

у меня такой код:
Код:

var mc:MyMC = new MyMC();
addChild(mc);
mc.play();
removeChild(mc);

при выполнении этого кода mc исчезает, но код внутри него продолжает выполняться (я поставил трейс внутри него, и трейс периодически выводится, показывая, что mc проигрывается). Почему он не удалился? Неужели его нужно остановить перед удалением? Если он подметается сборщиком мусора не сразу, то когда?

random13 08.04.2010 18:29

я думаю как минимум на него ссылаются переменные

Zebestov 08.04.2010 18:48

блин да из кода же видно все. ты ж сам все правильно написал: если нет ссылок на объект. а сам что? removeChild(mc) сделал, а mc=null нет.

sinya 08.04.2010 19:11

гм, а когда мне писать mc = null? Если до removeChild(mc), то он не поймет, что ему ремувить, если после - то сборщик мусора разочаруется, т.к. при removeChild(mc), mc != null. Сам-то пробовал?

СлаваRa 08.04.2010 19:13

после removeChild

sinya 08.04.2010 19:27

При таком коде невидимый mc продолжает проигрываться:
Код:

var mc:MyMC = new MyMC();
addChild(mc);
mc.play();
removeChild(mc);
mc = null;


Bgg 08.04.2010 19:29

Больше кода давайте. Где то там у вас косяк.

Волгоградец 08.04.2010 19:37

Все правильно. Даже если нет ссылок, то не факт что ГЦ моментально заберет объект. Нужно вручную остановить его.

Psycho Tiger 08.04.2010 19:53

Я бы даже сказал, что факт, что ГЦ заберёт его не сразу.

sinya 08.04.2010 19:57

Цитата:

Больше кода давайте. Где то там у вас косяк.
Нет, я специально упростил и проверил у себя в том виде, в котором показываю.

Цитата:

Все правильно. Даже если нет ссылок, то не факт что ГЦ моментально заберет объект. Нужно вручную остановить его.
Ну вот я и хочу узнать, когда все-таки срабатывает GC. Я ждал минуту, ничего. )

Zebestov 08.04.2010 20:08

Цитата:

Сообщение от sinya (Сообщение 898981)
бла-бла-бла... Сам-то пробовал?

регулярно.
на "бла-бла-бла" тебе ответили: после (разумеется)

а теперь по существу. ты что тут спрашиваешь?
- как гарантировать смерть ненужного уже мувика?
- или как инициировать немедленное его удаление — поторопить GC?

на первый вопрос тебе дали исчерпывающие ответы с кодом даже.
на тему второго (который вдруг всплыл) вот

Psycho Tiger 08.04.2010 21:26

Цитата:

бла-бла-бла... Сам-то пробовал?
Это где ты бла-бла-бла у sinya увидел?

Цитата:

Ну вот я и хочу узнать, когда все-таки срабатывает GC. Я ждал минуту, ничего. )
При создании кучи объектов он скорее всего вызовется. Всё зависит от звёзд андромеды или вызова unloadAndStop у Loader`а.

Zebestov 08.04.2010 22:23

Цитата:

Сообщение от Psycho Tiger (Сообщение 899018)
Это где ты бла-бла-бла у sinya увидел?

да вот:

Цитата:

гм, а когда мне писать mc = null? Если до removeChild(mc), то он не поймет, что ему ремувить, если после - то сборщик мусора разочаруется, т.к. при removeChild(mc), mc != null.
читай "бла-бла-бла". потому что это не вопрос. это болтовня: "а когда же нам обнулить ссылку на объект, который мы потом хотим по этой же ссылке вычеркнуть из списка?" :cool: хм... дай подумать... не торопи...

expl 08.04.2010 23:20

Цитата:

Сообщение от random13 (Сообщение 898965)
я думаю как минимум на него ссылаются переменные

Ну и что? Переменные освобождаются как только управление покидает функцию (случаи с анонимными функциями которые захватывают весь контекст переменных и держат его пока эту функцию никто не прибьет и до нее не доберется GC не всчет)

Здесь чисто у GC не было повода пошевилиться и очистить память.
Уничтожить объект в обход GC нельзя - так что перед удалением на него ссылок - осанови его - это общепринятая практика.

Psycho Tiger 08.04.2010 23:41

Цитата:

читай "бла-бла-бла". потому что это не вопрос. это болтовня: "а когда же нам обнулить ссылку на объект, который мы потом хотим по этой же ссылке вычеркнуть из списка?" хм... дай подумать... не торопи...
Это очень некрасиво, делать цитату от человека чего он не говорил.

К тому же, он нам сказал путь своих размышлений, что он думал и пришел в тупик. Например, я могу сказать что он ошибочно считает, что после removeChild вызывается GC.

Zebestov 08.04.2010 23:55

"очень некрасиво" ставить под сомнение простой совет фразой типо "Сам-то пробовал?". прекращаем флудить =) ответы даны. все должно быть понятно.

random13 09.04.2010 00:17

Цитата:

Сообщение от expl (Сообщение 899032)
Ну и что? Переменные освобождаются как только управление покидает функцию (случаи с анонимными функциями которые захватывают весь контекст переменных и держат его пока эту функцию никто не прибьет и до нее не доберется GC не всчет)

Здесь чисто у GC не было повода пошевилиться и очистить память.
Уничтожить объект в обход GC нельзя - так что перед удалением на него ссылок - осанови его - это общепринятая практика.

вот по этому я и написал как минимум, еще может быть масса факторов почему объект не зануляется, кстати помимо локальных переменных, еще могут быть переменные класса... короче читаем мука, и читаем 50 тем которые поднимают каждую неделю о об уборке за собой мусора


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

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