Пример утечки памяти AS3

Кто-то может отправить пример кода as3 (конкретно включенный слушатель события), который был бы простым примером чего-то, что могло пропустить память... также, надо надеяться, Вы могли отправить решение показанной проблемы?

Вопрос: Что такое простой пример просачивающейся памяти в слушателе события AS3 и как можно решить ее?

9
задан Skawful 9 April 2010 в 16:23
поделиться

1 ответ

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() будет продолжать выполняться.

7
ответ дан 4 December 2019 в 20:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: