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

TEI 10.07.2016 19:50

Сборщик мусора
 
Всем привет,

Я создаю класс и добавляю его на рабочую область.
Код AS3:

public var _Map:Map;
_Map = new Map();
zone_bg.addChild(_Map);
_Map.init();

Внутри него создаю множество мувиклипов, других мелких классов.

Затем я удаляю этот класс путем
Код AS3:

zone_bg.removeChild(_Map);

, нужно ли мне перед этим удалять вручную все созданное в этом классе ? Или флеш позаботится обо всем за меня?

undefined 10.07.2016 21:30

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

zackscript 10.07.2016 21:52

http://help.adobe.com/ru_RU/as3/mobi...7189-7ffc.html

PsychoTech 18.07.2016 06:51

Цитата:

Сообщение от undefined (Сообщение 1195388)
нужно удалить ссылку на объект, отписаться от всех событий исходящих от этого объекта, отписаться от всех событий внутри объекта и все остальное почистит флэш.
И разберитесь уже чем класс отличается от объекта.

првильно ли я понимаю что в каждом ребенке основного класса нужно слушать удаляется ли родитель и чистить все переменные

Код AS3:

 
//класс родителя
private var SomeVar: ChildClass;
 
public function ParentClass(){
addChild(Somevar)
this.addEventListener(Event.REMOVED, onRemove);
}
private function onRemove(e:Event):void{
removeEvetListener(Event.REMOVED, onRemove);
removechild(Somevar);
Somevar = null;
}

Код AS3:

 
//ChildClass
private var str: string= 'txt';
private var text: textfield;
 
public function ChildClass(){
//bla bla bla
addChild(text);
 
this.addEventListener(Event.REMOVED, onRemove);
}
private function onRemove(e:Event):void{
removeEvetListener(Event.REMOVED, onRemove);
str = null;
removechild(text);
text = null;
}

все верно?

Tails 18.07.2016 10:32

PsychoTech,
Не обязательно. Если внешних ссылок больше не осталось, все вложенные элементы тоже будут удалены.
Удалить переменную собственноручно в AS3 не возможно, str=null - это операция присвоения, а не удаления.

Для того, чтобы некоторое дерево из дисплей объектов удалилось, необходимо:
1. Удалить корневой элемент из дисплей листа. Именно удалить, visible=false - это не удаление.
2. Удалить все внешние ссылки, которые ссылаются хотя бы на один из элементов древа. Если есть хоть одна внешняя ссылка на любой элемент древа, оно всё продолжит жить. (Все элементы древа имеют ссылки друг на друга)
3. Ссылки могут остаться в листенерах, про которые вы забыли. Например, если есть слушатель на stage, который обрабатывается в методе дочернего элемента древа. Если вы использовали таймеры, их тоже необходимо остановить, активный таймер и всё на что он ссылается через слушатели не будет удален, пока активен.

И ещё не стоит писать весь код приложения "в кадрах" или использовать сцены (FlashIDE). Это одна из потенциальных проблем утечек, имхо.

PsychoTech 18.07.2016 21:15

Цитата:

Сообщение от Tails (Сообщение 1195503)
PsychoTech,
И ещё не стоит писать весь код приложения "в кадрах" или использовать сцены (FlashIDE). Это одна из потенциальных проблем утечек, имхо.

я работаю исключительно в феде. моя сцена это спрайт на котором собирается все что необходимо. С другим способом вывести все на экран как-то не ознакомлен. Если есть другой способ, то будьте добры ссылку на материал или своими словами в кратце.
на счет str= null, этот как раз идет из видимо плохо усвоеного адобовского материала. там явно говориться чтобы присваивали всем значение null, чтобы автосборщик мусора это убрал.
На счет слушателей, это я если не ошибаюсь впитал с первым молоком так сказать, а именно из книги Мука. Не буду в даваться в подробности прочтения, по нему собственно и учился, потом ощутил недостаток знаний и сполз на мануалы классов от аддоба. Хотя там временами встречается довольно таки сложные к восприятию материалы. В я это к тому что всех слушателей событий включая и свои собственные я научился удалять еще до того как научился писать hello world на as3.

Tails 18.07.2016 23:38

Я просто перечислил три типичные проблемы утечек. В каждом конкретном случае нужно сидеть и искать причину в коде, пытаться изолировать. В ходе дискуссий мы тут наврядли это выясним. Занулять абсолютно всё не обязательно, достаточно что-бы не было внешних ссылок.

caseyryan 19.07.2016 07:11

Слушать удаление родителя, чтобы подчищать что-то там - очень плохая идея. Может получиться так, что данные зачистятся, а объект нужно использовать повторно.
Самый лучший способ удалять данные - написать отдельный метод dispose() в каждом своем классе, в этом методе произвести все зачистки, и явным образом его вызывать при необходимости на всех объектах

dimarik 20.07.2016 17:36

Самый лучший способ удалять объекты в системах с garbage collector — занулять ссылки на эти объекты. Костыли в виде dispose() до добра не доводят.

undefined 20.07.2016 18:00

так одно другому не мешает
Код AS3:

myObj.dispose();
myObj=null;

либо
Код AS3:

myObj.dispose();
myObj=new MyObj();

Или предлагается какая-то другая реализация dispose?


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

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