Как правильно удалить и проверить на предмет удаления - PullRequest
1 голос
/ 23 января 2012

Я заметил нечто опасное при работе с AS3 - некоторые объекты (а именно DisplayObjects / MovieClips), как правило, остаются в памяти и даже выполняют действия после удаления всех ссылок на них.

Я работаю с Flash CS 5.5 и Flash Builder 4.6.

После удаления всех ссылок (включая removeChild (...) из класса документа) некоторые объекты, похоже, остаются в живых.

Этот вопрос может возникнутьнемного шире - но я пытаюсь понять, что я могу сделать, чтобы УБЕДИТЬСЯ в том, что какой-то объект поднят сборщиком мусора?Более того, как я могу получить какую-то обратную связь от GC, которая означает, что определенный объект был уничтожен?(Например, консольное сообщение)

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 23 января 2012

Удаление объекта со сцены, удаление слушателей событий и установка всех ссылок на null должно быть достаточно - GC подберет его при следующем выполнении.

Однако утомительно отслеживать все ссылки (и помните, что это включает слушателей событий, если вы не установили useWeakReference в true), если у вас нет стандартного способа сделать это ... Это Желательно иметь функцию «деструктор» в каждом классе, которая заботится об очистке всех переменных и прослушивателей событий, когда объект больше не нужен.

Вы также можете комбинировать их с событиями - я пришел к выводу, что хорошей практикой является выполнение вашей init() функции на Event.ADDED_TO_STAGE и функции destroy() на Event.REMOVED_FROM_STAGE. Таким образом, у вас есть четко определенный жизненный цикл для сценических объектов, и если вы убедитесь, что ваш метод destroy() останавливает все анимации и звуки, удаляет всех дочерних элементов и слушателей событий и устанавливает для всех полей переменных-членов значение null, вы можете уверен, что больше нет никаких действий, которые могли бы вызвать нежелательные побочные эффекты.

Кстати - если вы на самом деле замечаете любое действие с объектом, который вы удалили, некоторые ссылки, безусловно, все еще должны быть нетронутыми - как еще вы могли бы узнать?

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

Если вы сделаете привычку убирать за собой, ваши программы будут неизбежно становиться более стабильными, потреблять меньше памяти и в конечном итоге работать лучше. Это все, что должно иметь значение.

2 голосов
/ 23 января 2012

@ weltraumpirat, безусловно, имеет несколько хороших идей, и создание цикла инициализации / уничтожения является хорошей практикой. Однако есть и другие вопросы, которые вы можете рассмотреть.

Создание новых объектов может быть дорогостоящим процессором, поэтому использование общего метода init / destroy может оказаться не лучшим способом, в зависимости от того, что на самом деле делает ваше приложение. Возможно, вы захотите создать пул объектов и повторно использовать их в своем приложении.

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

http://divillysausages.com/blog/tracking_memory_leaks_in_as3

...