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

switcher! 28.07.2009 01:05

"Природа" существования и удаления объектов
 
Хотелось бы узнать, как стереть само значение объекта из приложения во время работы (дабы оно не засоряло память).
removeChild всего лишь удаляет DisplayObject из списка отображения
а delete по тому же Муку:
"Удаляет динамическую переменную экземпляра объекта."

Из списка отображения убрали, переменную удалили, а что с самим объектом? его как снести?

Второй момент - если переменной с объектом присвоить другой объект, то значение первичного объекта удаляется или переменная просто начинает ссылаться на другой объект?

Герыч 28.07.2009 01:35

Цитата:

Второй момент - если переменной с объектом присвоить другой объект, то значение первичного объекта удаляется или переменная просто начинает ссылаться на другой объект?
Мои знания ООП подсказывают мне, что если на объект нету других ссылок, то он уходит в распоряжение Garbage Collector'а, то есть ты его не вернёшь, но он немного живёт.

По первому пункту ничего не знаю, но всё скорее упирается в запуск этого GC

Аллиас 28.07.2009 01:38

Тот же Мук, в своей книге отлично дает понять, что "вручную" удалить из памяти созданный объект или значение переменной нельзя, можно лишь сделать объект доступным для "сборки мусора" удалив все существующие ссылки на него.

Система сборки мусора (Garbage Collector) предназначена для автоматической очистки памяти, и запускается, когда минимальное ее количество, отведенное Flash ролику, превышается. В зависимости от сложности программы, "сборщик" периодически проверяет и "помечает" объекты, к которым больше нельзя обратится, как "доступные для удаления", после чего помеченные значения впоследствии удаляются в "цикле зачистки". Самостоятельно запустить и управлять системой сборки мусора во Flash невозможно. Она запускается самостоятельно и отлично справляется со своей задачей (при минимуме усилий от программиста).

В общем чтобы "удалить" объект из памяти достаточно позаботится об отсутствии ссылок на него (присвоить переменной значение новое значение, очистить интервал, удалить слушатель события и.т.д...)

Поправьте меня, если в чем-то ошибся.

switcher! 28.07.2009 01:52

таким образом конструкция:
Код AS3:

addChild(new Sprite());

создаст спрайт который удалить невозможно никак ? кроме, разве что, случая с удалением самого объекта parent

willis83 28.07.2009 02:04

removeChildAt

switcher! 28.07.2009 02:09

а если индексов сотни? ))))
но возможность есть - согласен.
Спасибо всем! разобрался

marat_sa 28.07.2009 10:13

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

iflamberg 28.07.2009 11:35

ссылки могут потеряться. Недавно столкнулся с этим.
Например, если ты создаешь в цикле большое количество лоадеров:
Код:

loader = new Loader ();
loader.load (new URLRequest(str));
info = loader.contentLoaderInfo;
info.addEventListener (Event.COMPLETE, styleBtnLoadCompleteHandler);
info.addEventListener (IOErrorEvent.IO_ERROR, styleBtnIOErrorHandler);

То GC может их съесть!
Пришлось сделать так
Код:

tempArray.push(loader);
тогда не съедает, пока не освободишь массив.

Такая же проблема есть у стандартных адобовских Tween. Если не сохранить твин в ссылке - он может умереть.

marat_sa 28.07.2009 11:46

Да, про твины в курсе.

2 iflamberg, а если экземпляр лоадера или подгружаемого объекта сразу кинуть в список отображения в твоем случае? Тогда его съест красная рука GC?

iflamberg 28.07.2009 11:49

очень сомневаюсь


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

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