![]() |
Корректное удаления экземпляра из памяти
Привет всем.
Простая ситуация: есть объект, в конструкторе создается кнопка, подписывается на MouseEvent.CLICK. Потом экземпляр этого объекта удаляется (removeChild) с родителя. Нужно ли отписать кнопку от MouseEvent.CLICK для корректного удаления из памяти? Спасибо. |
Да нужно.
|
Знатоки говорят точно надо, сам стараюсь так и делать всегда, но может именно тут зря?
Удаление подписки за "внешние" объекты на обсуждается, вопрос именно о внутренних объектах класса. Спасибо. |
Наличие слушателя равносильно наличию ссылки на объект. Удалив слушатель самостоятельно Вы упрощаете работу сборщику мусора (GC), таким образом увеличивая производительность всего приложения. Так что стоит взять за правило отписываться от всех событий и занулять все ссылки, если объект больше не нужен. И неважно - внутри самого объекта, или снаружи.
|
Цитата:
Цитата:
Добавлено через 31 секунду Опоздал |
В некоторых случаях можно использовать weakReference=true:
Код AS3:
|
Это я все знаю и использую. Вопрос в целесообразности удаления подписки на объект, который является ребенком и "убивается" автоматически при "убийстве" родителя.
|
Он не убивается, если на него есть ссылки. Это покажет любой профайлер.
|
Слушатель клика не грузит память - это вам не интерфрейм или таймер, и даже не кастомЭвент, который может произойти от чего угодно ( по вашей реализации ) - соотв слушатель клика, овера и т.д. после ремува сносить не обязательно совершенно, но желательно в рамках красивой организации кода, и только
|
Цитата:
|
На тормоз в автомобиле жать
Цитата:
Цитата:
Код AS3:
|
Цитата:
|
Цитата:
тем, не менее, где-то здесь @etc (могу ошибаться, но кажется все-таки @etc) писал, что не обязательно отписывать слушателей внутренних событий в удаляемом объекте... тоже о чём то народ спорил... Но, я всё равно отписываю всех слушателей - так, на всякий случай, в порядке армейского ... а Можно проверить профайлером, это вроде не сложно. |
Когда избавлялся от утечек памяти дошел до того, что даже для самых мелких вещей сделал метод destruct(); в котором сносились все листенеры со всех полей, ремувились ДО, вызывался деструкт младших уровней и занулялись ссылки. Только после этого получилось очищать полностью память.
Когда на сцене был, а потом сплыл многоярусный контейнер, он тоже любит повиснуть иногда в памяти, если его не разобрать на кусочки. Вот пример (смотрите в приложении): Классы Level0-1-2-3 -- наследники спрайта с пустым телом. Код AS3:
http://*************/s/1oHmT -- если в памяти повис объект нулевого уровня, то тащит за собой цепочку детей. А если рекурсивно разделить все от всего, то вот такой (который тоже не идеален. почему -- увы, не знаю, надеюсь, кто-нибудь объяснит) http://*************/s/1oHkQ Так что очистить все слушатели, задеструктить и занулить все, до чего дотянешься -- святое дело каждого. |
| Часовой пояс GMT +4, время: 13:53. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.