Я бы посоветовал вам прочитать главу 14 «Сборка мусора» в «Книге муков» (Essential ActionScript 3.0 от O'Reilly Publishing).
Короткий ответ на ваш вопрос заключается в том, что вы не контролируете выделение памяти, а сборщик мусора. В языках со сборкой мусора, таких как AS3 или Java, у вас нет ручного управления выделением и освобождением памяти, как в языках нижнего уровня; нет эквивалентов AS3 таким вещам, как удалить в C ++ или бесплатно в C. Ваша цель не должна контролировать, когда вы уничтожаете объекты, а скорее не забывать удалять ссылки на вещи, которые вам больше не нужны, и убедитесь, что вы отключили то, что намеревались использовать для сборки мусора.
Утечки памяти в AS3 обычно происходят из-за неправильного понимания новичком (например, мысли о том, что removeChild или установка ссылки на null уничтожает объекты), и из-за плохого отслеживания ссылок на объекты, особенно когда задействованы сильные слушатели.
Предыдущий респондент опубликовал это:
myObject = null;
Это удаляет ссылку на объект, который хранится в переменной myObject. Больше ничего. Вам нужно знать намного больше о ситуации, чтобы иметь возможность сказать, делает ли это присвоение даже соответствующий объект подходящим для сборки мусора, особенно сколько других переменных содержат ссылки на объект. И объект может уже иметь право на сборку мусора, даже если вы не установили для ссылки значение null (т.е. если myObject не имеет связи с корнем сборщика мусора).
Достаточно сказать, что весь механизм GC более сложен, чем можно удовлетворительно объяснить в сообщении StackOverflow. Вот почему у него есть целая глава в книге Moock Book, и даже в этой книге нет подробностей реализации или подробностей о том, когда именно Flash Player выполняет подсчет ссылок на удаления или отметки и проходы очистки.
Самое важное, что нужно помнить, ИМХО:
Когда вы намереваетесь «убить» объект, дайте ему функцию cleanUp () или destroy (), в которой вы делаете такие вещи, как остановка всех его таймеров, звуков, удаление слушателей и т. Д. Объект будет продолжать существовать и выполнять код, пока не получит GC'd. А Flash Player откладывает сборщик мусора до тех пор, пока это возможно - обычно он запускается, когда проигрывателю требуется выделить больше оперативной памяти из вашей системы, потому что выделение памяти - это единственное, что требует больше времени, чем выполнение метки и очистки сборщика мусора.
Читайте о слабых и сильных слушателях. По сути, когда у вас слабый слушатель, ссылка на слушателя игнорируется сборщиком мусора с меткой и очисткой, поэтому сама по себе она не помешает сбору объекта. Но не слушайте тех, кто говорит вам «всегда используйте слабые» или «всегда используйте сильные слушатели и вручную удаляйте их», потому что бывают случаи, когда каждый из них подходит, и поэтому выбор за вами.
person
Adam Smith
schedule
05.05.2011