Это не ответ, но больше объясняет, почему встроенные замыкания являются утечкой памяти, из запроса комментария @js _.
Управление памятью во Flash осуществляется 2 способами; подсчет ссылок, маркировка и развертка (для получения более подробной информации ознакомьтесь с http://divillysausages.com/blog/tracking_memory_leaks_in_as3).
Утечка памяти происходит из-за вызова addEventListener()
. По умолчанию addEventListener
создаст ссылку на объект, который он слушает - как, например, ваша анонимная функция будет содержать ссылку на ваш объект.
Вы можете сделать его слабым слушателем, но поскольку ваша функция анонимна, у нее нет других ссылок, а это означает, что, если вы прослушиватель событий был слабым, все это будет собрано в конце функции (то же самое, если вы использовали локальная переменная).
Итак, чтобы заставить работать анонимные функции, вам нужно сделать слушателя события сильным. Но когда вы пришли, чтобы удалить слушателя, вы не можете получить доступ к анонимной функции, поэтому вы не можете удалить ее. В лучшем случае вы теряете память, выделенную для обратного вызова. В худшем случае ссылка на ваш объект анонимной функцией означает, что сам объект никогда не будет собран (что может привести к цепочке), поскольку Flash считает, что он все еще используется.
Если сам объект в конечном итоге не имеет других ссылок, кроме прослушивателя событий, то оба должны быть собраны во время фазы метки и развертки (так как это было разработано с учетом таких циклических ссылок). Тем не менее, вы никогда не хотите, чтобы метка и развертка запускались - это чертовски медленно (вы, вероятно, будете часто замечать паузу в своей программе) и только когда оно начнется, когда использование памяти начнет выходить из-под контроля. Вы хотите контролировать подсчет ссылок самостоятельно