|
|
|||||
Регистрация: Nov 2010
Сообщений: 111
|
Сборщик мусора
Всем привет,
Я создаю класс и добавляю его на рабочую область. Внутри него создаю множество мувиклипов, других мелких классов. Затем я удаляю этот класс путем , нужно ли мне перед этим удалять вручную все созданное в этом классе ? Или флеш позаботится обо всем за меня? |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
нужно удалить ссылку на объект, отписаться от всех событий исходящих от этого объекта, отписаться от всех событий внутри объекта и все остальное почистит флэш.
И разберитесь уже чем класс отличается от объекта. |
|
|||||
|
|
|||||
Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
|
Цитата:
//класс родителя 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; } //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; } |
|
|||||
PsychoTech,
Не обязательно. Если внешних ссылок больше не осталось, все вложенные элементы тоже будут удалены. Удалить переменную собственноручно в AS3 не возможно, str=null - это операция присвоения, а не удаления. Для того, чтобы некоторое дерево из дисплей объектов удалилось, необходимо: 1. Удалить корневой элемент из дисплей листа. Именно удалить, visible=false - это не удаление. 2. Удалить все внешние ссылки, которые ссылаются хотя бы на один из элементов древа. Если есть хоть одна внешняя ссылка на любой элемент древа, оно всё продолжит жить. (Все элементы древа имеют ссылки друг на друга) 3. Ссылки могут остаться в листенерах, про которые вы забыли. Например, если есть слушатель на stage, который обрабатывается в методе дочернего элемента древа. Если вы использовали таймеры, их тоже необходимо остановить, активный таймер и всё на что он ссылается через слушатели не будет удален, пока активен. И ещё не стоит писать весь код приложения "в кадрах" или использовать сцены (FlashIDE). Это одна из потенциальных проблем утечек, имхо.
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
|
Цитата:
на счет str= null, этот как раз идет из видимо плохо усвоеного адобовского материала. там явно говориться чтобы присваивали всем значение null, чтобы автосборщик мусора это убрал. На счет слушателей, это я если не ошибаюсь впитал с первым молоком так сказать, а именно из книги Мука. Не буду в даваться в подробности прочтения, по нему собственно и учился, потом ощутил недостаток знаний и сполз на мануалы классов от аддоба. Хотя там временами встречается довольно таки сложные к восприятию материалы. В я это к тому что всех слушателей событий включая и свои собственные я научился удалять еще до того как научился писать hello world на as3. |
|
|||||
Я просто перечислил три типичные проблемы утечек. В каждом конкретном случае нужно сидеть и искать причину в коде, пытаться изолировать. В ходе дискуссий мы тут наврядли это выясним. Занулять абсолютно всё не обязательно, достаточно что-бы не было внешних ссылок.
__________________
Дети не должны знать о своих родителях |
|
|||||
Слушать удаление родителя, чтобы подчищать что-то там - очень плохая идея. Может получиться так, что данные зачистятся, а объект нужно использовать повторно.
Самый лучший способ удалять данные - написать отдельный метод dispose() в каждом своем классе, в этом методе произвести все зачистки, и явным образом его вызывать при необходимости на всех объектах
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
.
|
Самый лучший способ удалять объекты в системах с garbage collector — занулять ссылки на эти объекты. Костыли в виде dispose() до добра не доводят.
|
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
так одно другому не мешает
либо Или предлагается какая-то другая реализация dispose? |
Часовой пояс GMT +4, время: 23:54. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|