|
|
|||||
Регистрация: Feb 2009
Сообщений: 141
|
Лики памяти (общее)
Хочу еще раз затронуть тему ликов памяти при выполнении флеш приложения.
Я думаю, что не все программисты проверяют свои разработки на подобные баги или часто используют профайлер? Особенно остро этот вопрос стоит, когда юзается более менее большое приложение и достаточно долго без его перезагрузки. Я довольно часто ощущаю подобные неудобства, работая с различными приложениями, буквально с каждой минуты его работы, заметна разница в падении производительности работы приложения. Все эти неудобства в большинстве случаев вызваны большим количеством динамических событий. Большое число временных объектов подписываются на события, которые ожидают прослушивания, но не дождавшись их, далеко наверху удаляется объект, который содержит в себе все это и не может удалиться из памяти, так как по прежнему ожидает n-ое кол-во прослушиваний. Так как же избежать такой ситуации, когда мы удаляем объект на порядок выше в структуре и не можем (точнее можем, но окольными путями) отписать все его потроха от событий? В каждом классе, где используются динамические события, да и вобще события, от которых нужно отписаться при удалении этого экземпляра я использую следующий простой способ. public class Test extends Sprite { public function Test() { super(); this.addEventListener(Event.REMOVED_FROM_STAGE, __thisRemove); } private function __thisRemove(e:Event):void { this.removeEventListener(Event.REMOVED_FROM_STAGE, __thisRemove); //Отписываемся от динамических событий } } Или даже, возможно, я использую велосипед, кто как выходит из положения, можете поделиться опытом? Вопрос я этот поднял потому, что программируя несколько лет и разрабатывая приложения, где лики памяти были ощутимы, эти две строчки кода в тот момент для меня не были очевидными. |
|
|||||
Утечки памяти и их устранение
Нужно писать деструкторы и использовать их по назначению. Ваш метод годится (да и то крайне редко) только для экранных объектов, и я бы сказал, что его польза сомнительна. |
|
|||||
Регистрация: Aug 2007
Сообщений: 54
|
Вопрос такой а если я перезаписываю какую либо переменную новым экземпляром удаляется ли предыдущий объект из памяти?
Удаляется ли то что выделялось под Class1? |
|
|||||
Регистрация: Aug 2007
Сообщений: 54
|
Еще такой вопрос, если внутри контейнера несколько разных объектов, их тоже надо удалять из списка отображения и обнулять перед тем как обнулить этот контейнер, или достаточно обнулить сам контейнер?
Насчет обработчиков понятно. Если они есть внутри контейнера то отписываемся. |
|
|||||
.
|
@Vreden
Безобразие. У вас ошибка в слове "памяти". Правильно писать "лики мемори". Есть хороший русскоязычный термин "утечка". Последний раз редактировалось dimarik; 30.08.2011 в 21:31. |
|
|||||
Цитата:
Я стараюсь отписаться всегда маниакально от всего, делая деструкторы. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Подписки на самого себя можно не убирать.
|
|
|||||
Когда проектирую объект стараюсь тщательно продумывать его инициализацию и уничтожение, а от событий стараюсь отписываться сразу как только появляется возможность. GC вызываю silin-ским скриптиком. А по другому и не возможно, ИМХО, контролировать ресурсы.
|
Часовой пояс GMT +4, время: 22:00. |
|
« Предыдущая тема | Следующая тема » |
|
|