Кто-то может отправить пример кода as3 (конкретно включенный слушатель события), который был бы простым примером чего-то, что могло пропустить память... также, надо надеяться, Вы могли отправить решение показанной проблемы?
Вопрос: Что такое простой пример просачивающейся памяти в слушателе события AS3 и как можно решить ее?
public class MySprite extends Sprite {
public function MySprite() {
if(stage) {
init();
} else {
addEventListener(Event.ADDED_TO_STAGE,init);
}
}
private function init(e:Event = null):void {
stage.addEventListener(Event.RESIZE,handleStageResize);
}
private function handleStageResize(e:Event):void {
// do some processing here.
}
}
Где-то еще:
var mySprite:MySprite = new MySprite();
someHolder.addChild(mySprite);
Теперь, если в какой-то более поздний момент вы удалите mySprite, он все еще будет болтаться в памяти, потому что он добавил себя (или ссылку на себя) на сцену в методе init().
В этом сценарии лучшим способом избежать этого может быть удаление слушателя, добавленного на сцену, когда mySprite удаляется из списка отображения.
private function init(e:Event = null):void {
addEventListener(Event.REMOVED_FROM_STAGE,cleanUp);
stage.addEventListener(Event.RESIZE,handleStageResize);
}
private function cleanUp(e:Event):void {
stage.removeEventListener(Event.RESIZE,handleStageResize);
}
Я уверен, что другие люди скажут вам использовать слабые ссылки при добавлении слушателя на сцену, но в любом случае вам следует удалять слушателей. Если вы этого не сделаете, то когда вы удалите mySprite из списка отображения, и у вас не останется других ссылок на него, он будет подлежать GC и в конце концов будет стерт из памяти. Но пока этого не произошло, код в handleStageResize() будет продолжать выполняться.