AS3 Удаление объекта

293 views
Skip to first unread message

Aleksey Matveev

unread,
Dec 26, 2008, 3:51:05 AM12/26/08
to ruFlash
Всем привет.
Хотелось бы спросить как правильно осуществлять удаление объекта.
Уточню. Прочитав Колина Мука, я во всех объектах определяю метод
destroy(), ну а в нем отписываюсь от событий и обнуляю ссылки.
останавливаю таймеры. Когда объект мне не нужен, я вызываю
myObj.destroy() и обнуляю ссылку на объект(myObj) в родителе.

Но, когда смотришь чьи либо исходники в сети, то замечаешь что такую
технику мало кто применяет.
Помогите разобраться как лучше? Как практичнее?

ign

unread,
Dec 26, 2008, 3:55:27 AM12/26/08
to ruF...@googlegroups.com

> Прочитав Колина Мука, я во всех объектах определяю метод
> destroy(), ну а в нем отписываюсь от событий и обнуляю ссылки.
> останавливаю таймеры. Когда объект мне не нужен, я вызываю
> myObj.destroy() и обнуляю ссылку на объект(myObj) в родителе.
>
Это хорошая практика.
Только нужно не забыть отписаться от событий,
на которые вы подписались к объекту myObj.

--
ign
_____________________________________________________________________
http://www.isky.ru

Nox Noctis

unread,
Dec 26, 2008, 4:01:08 AM12/26/08
to ruF...@googlegroups.com
> Но, когда смотришь чьи либо исходники в сети, то замечаешь что такую
> технику мало кто применяет.
> Помогите разобраться как лучше? Как практичнее?

Правильным путем идете, товарищ.
Есть еще подписки со слабыми ссылками, но я лично их не использую.
По-моему это не дело намеренно позволять себе забывать отписываться от
событий. Чем больше таких моментов, тем больше анархии в системе. А
когда начинается передел власти между тобой, разработчиком, и классами
системы, обычно все встает колом.

А что до чужого кода... Если ты пишешь три строчки кода для баннера,
можешь вообще ничего не удалять. Никто не заметит. :) А если система
большая и сложная, то без какого-то разумного управления временем жизни
объектов не обойтись. И понимание необходимости всяких destroy() и т. п.
приходит как раз тогда, когда в таск манагере прочесс firefox.exe
доедает последнюю планку памяти и начинает вгрызаться в материнскую
плату. Поэтому может показаться, что такой подход мало кто использует.
Немного кто разрабатывает такие системы, где без этого не жить.

--
Michael Antipin
______________________________________________________________________
n...@gammagroup.ru | http://www.gammagroup.ru | http://www.noregret.org

Aleksey Matveev

unread,
Dec 26, 2008, 4:14:21 AM12/26/08
to ruFlash
Всем спасибо! Развеели мои сомнения. А то пишу и пишу, а у других ни
чего похожего не наблюдаю)))

Vietnam

unread,
Dec 26, 2008, 5:48:28 AM12/26/08
to ruFlash
а не могли бы вы написать вы метод destroy().
интересно как можно отписываться от всех слушателей итп вишки.
мне как раз это бы пригодилось.

ign

unread,
Dec 26, 2008, 5:51:15 AM12/26/08
to ruF...@googlegroups.com
Vietnam пишет:

> а не могли бы вы написать вы метод destroy().
> интересно как можно отписываться от всех слушателей итп вишки.
> мне как раз это бы пригодилось.
> --~--~---------~--~----~------------~-------~--~----~
>
Вообще-то это делается врукопашную :) Просто унифицированное имя метода.

Vietnam

unread,
Dec 26, 2008, 5:59:29 AM12/26/08
to ruFlash
> Вообще-то это делается врукопашную :) Просто унифицированное имя метода.

ясно, а обнуление ссылок это значит всем переменным присваивается
NULL?

ign

unread,
Dec 26, 2008, 6:06:19 AM12/26/08
to ruF...@googlegroups.com

> ясно, а обнуление ссылок это значит всем переменным присваивается
> NULL?
>
null, верно.

Oleg Dolya

unread,
Dec 26, 2008, 8:00:35 AM12/26/08
to ruF...@googlegroups.com
С таким же успехом можно, например, true присваивать или 2009 если тип позволяет :)

2008/12/26 Vietnam <yerzhan...@gmail.com>

Flop Serg

unread,
Dec 26, 2008, 11:18:55 AM12/26/08
to ruF...@googlegroups.com
С таким же успехом можно, например, true присваивать или 2009 если тип позволяет :)

Гарбаж коллектор очень хорошо на null реагирует )

andrey Vichodcev

unread,
Dec 26, 2008, 12:01:52 PM12/26/08
to ruF...@googlegroups.com


Гарбаж коллектор очень хорошо на null реагирует )


)
если оно ему надо.

WyBaeB

unread,
Dec 26, 2008, 2:54:49 PM12/26/08
to ruFlash
Кстати о gc.
Всетаки можно каким - нибудь хаком вызвать его принудительно?

On 26 дек, 20:01, "andrey Vichodcev" <andrey.vichod...@gmail.com>
wrote:

Roma Oskolkov

unread,
Dec 26, 2008, 2:57:59 PM12/26/08
to ruF...@googlegroups.com
Есть хак с двумя ЛокалКонекшнами.
Впервые услышал об этом от Нокс Нокстиса, он же показал реализацию тут в группе, в одной теме, месяца три назад.

Daniil Tutubalin

unread,
Dec 26, 2008, 4:53:30 PM12/26/08
to ruF...@googlegroups.com
В 10-й версии плеера появился метод unloadAndStop(), который выгружает
мувик со всем содержимым (ну почти) и говорит gc, что надо бы
подмести.
Правда, как я понял, gc может и отказаться.
Есть ещё метод gc(), но он работает только в Debug версии проигрывателя.

Чтобы следить, какие объекты удаляются, а какие нет, можно
воспользоваться профайлером из Flex Builder. Правда он жутко глючный.
По крайней мере у меня возникало много проблем, когда я пытался
подсунуть ему произвольную .swf-ку.

Ещё можно соорудить свой псевдопрофайлер-монитор. Для этого создаете
словарь со слабыми ссылками:

monitor = new Dictionary(true);

Затем помещаете туда все подозрительные объекты:

monitor[suspectedObject] = true;

И когда нужно, проверяете, что в нём ещё осталось:

for each (var i in monitor) {
textField.appendText(i+"\n");
}

Nox Noctis

unread,
Dec 26, 2008, 6:17:26 PM12/26/08
to ruF...@googlegroups.com
> Есть хак с двумя ЛокалКонекшнами. Впервые услышал об этом от Нокс
> Нокстиса, он же показал реализацию тут в группе, в одной теме, месяца
> три назад.

Хак с двумя локалконнекшнами рассказал Грант Скиннер еще в 2006 году.
Гуглом можно найти. Как он дошел до жизни такой -- неведомо, но это
работает.

try {
new LocalConnection().connect("gc");
new LocalConnection().connect("gc");
} catch (error:Error) {
// ignore
}

Это заставит GC запустится. Однако, стоит учитывать, что за один проход
коллектор может и не собрать весь мусор (никто этого и не обещал).

> Есть ещё метод gc(), но он работает только в Debug версии
> проигрывателя.

Кстати в AIR работает и в недебаговой версии, если контент, который
запускает System.gc() находится в песочнице установленного AIR-приложения.

Flop Serg

unread,
Dec 27, 2008, 6:15:18 AM12/27/08
to ruF...@googlegroups.com
Еще незнаю хак или нет но GC србатывает при вызове метода Loader.unloadAndStop()

Shaman

unread,
Dec 27, 2008, 6:30:21 AM12/27/08
to ruF...@googlegroups.com

Еще незнаю хак или нет но GC србатывает при вызове метода Loader.unloadAndStop()
Только в 10 ФП

WyBaeB

unread,
Dec 27, 2008, 6:38:06 AM12/27/08
to ruFlash
Спасибо, а то как-то было нужно, искал здесь и не нашел

andrey Vichodcev

unread,
Dec 29, 2008, 3:26:44 AM12/29/08
to ruF...@googlegroups.com
Однако, стоит учитывать, что за один проход
коллектор может и не собрать весь мусор (никто этого и не обещал).

если удалять объект и сразу вызывать этим способом GC 

try {
    new LocalConnection().connect("gc");
    new LocalConnection().connect("gc");
} catch (error:Error) {
    // ignore
}
 
 у меня ничего не очищается. нужен интервал в один фрэйм. также не всегда очищаются объекты у которых есть "подписки со слабыми ссылками".

а нужно ли принудительно вызывать GC ?
если все сделано грамотно (и без "слабых ссылок"), то объект просто остается висеть в памяти. если памяти будем мало, GC сам запустится и все почистит.


Reply all
Reply to author
Forward
0 new messages