Должен ли я удалить слушателей перед удалением пользовательского объекта? - PullRequest
2 голосов
/ 23 августа 2011

Я загружаю в пустой мувиклип (через addChild) библиотечный объект (мувиклип класса MyObject, который расширяет класс MovieClip). В какой-то момент из основного я удаляю этот пользовательский мувиклип из его родителя и устанавливаю любую ссылку на ноль, чтобы полностью уничтожить его. Вопрос: что если в пользовательском классе movieclip есть EventListeners? Они удаляются, когда я уничтожаю объект? Должен ли я написать метод для их удаления перед удалением объекта?

Ответы [ 3 ]

1 голос
/ 23 августа 2011

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

1 голос
/ 23 августа 2011

Я включаю некоторый тип destroy() метода почти в каждый класс, который я пишу. Этот метод отвечает за все экземпляры или ссылки на любые дочерние объекты в этом классе. Это включает в себя любые прослушиватели, ссылки на список отображения и т. Д. Затем, прежде чем я удаляю / обнуляю родительский элемент, я вызываю его метод destroy(), чтобы обеспечить надлежащий сборщик мусора и избежать утечек памяти. Обратите внимание, что при необходимости это может связать глубоко вложенные объекты.

Вы могли бы просто использовать слабые ссылки и удалить весь объект. ASVM2, как правило, достаточно умен, чтобы правильно уничтожать дочерние объекты НО это в лучшем случае плохое управление GC, а вы просто просите утечки памяти.

Мои $ .02.

1 голос
/ 23 августа 2011

В идеале вы должны очистить все внутренние ссылки в объекте, если вы пытаетесь уничтожить его для целей сборки мусора.Вы также можете создать своих слушателей со слабыми ссылками, чтобы они автоматически уничтожались, передавая пятый аргумент как true, но я лично рекомендую не использовать слабые ссылки и не привыкать к правильной очистке вручную.

//setting a weak referenced listener
foo.addEventListener(Event.WHATEVER,bar(),false,0,true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...