Вложенные функции, как они собирают мусор во flash actioncript 3? - PullRequest
1 голос
/ 07 января 2010

У меня очень сложная функция в as3. Функция состоит из многих других функций, которые вложены в нее. Основная функция имеет переменные, и все ее вложенные функции также имеют свои собственные переменные. Некоторые из вложенных функций вызываются событиями, которые были добавлены в основную функцию или в другую вложенную функцию.

Теперь я хочу знать, когда моя основная функция будет собирать мусор? Когда код выйдет из основной функции? А когда переменные, события и вложенные функции будут собираться мусором?

П.С .: Чтобы добавить больше деталей. Представьте, что моя основная функция называется loadImages () и содержит несколько вложенных функций: connectToServer (), sortImages () и onImagesLoaded (). При первом вызове loadImages () он создает переменную url и переменную массива images. Затем он вызовет свою внутреннюю функцию connectToServer (). Эта функция подключится к серверу, начнет загрузку изображений и добавит прослушиватель событий onComplete, который будет вызывать onImagesLoaded () после загрузки всех изображений. После загрузки всех изображений из-за события вызывается onImagesLoaded (). Эта функция удалит прослушиватель события onComplete и вызовет sortImages () и передаст ему загруженные изображения в качестве параметра. После этого sortImages () отсортирует изображения по алфавиту и поместит их в массив изображений основной функции loadImages (). Наконец, loadImages () добавит к сцене изображения в массиве.

Спасибо.

1 Ответ

1 голос
/ 07 января 2010

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

Существует также снижение производительности за использование вложенных функций, но оно действительно проявляется только в бесполезных микро-бенчмарках, которые никогда не должны влиять на реальное приложение.

Если вам нужно использовать вложенные функции, убедитесь, что вы удалили их как слушатели событий, когда закончите с ними. Это сделает их доступными для сбора мусора. Вы можете убедиться, что вы всегда регистрируете их как слабых слушателей событий, чтобы событие не учитывалось в зависимости от того, доступны ли они (или полученные ими переменные) для GC. Однако, поскольку они являются вложенными функциями, вполне вероятно, что единственное, что их удерживает, - это регистрация событий.

...