Я прочитал очень хорошую статью о том, как Flash выполняет сборку мусора: http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html
Но мне было интересно, что все, что вам нужно сделать, чтобы убедиться, что все ваши объекты были собраны мусором с помощью более быстрого метода подсчета ссылок, а не более интенсивного ЦП метода маркировки и очистки. Предположим, у меня есть следующая функция, и я создаю с ней объект:
function makeIt():void {
var spriteA:Sprite = new Sprite();
var spriteB:Sprite = new Sprite();
spriteB.addEventListener(MouseEvent.CLICK, myCallback);
var spriteC:Sprite = new Sprite();
spriteA.addChild(spriteB);
spriteB.addChild(spriteC);
stage.addChild(spriteA);
}
Если бы я просто сделал следующее, было бы это приемлемо для GC только по метке и развертке?
spriteB.removeEventListener(MouseEvent.CLICK, myCallback);
stage.removeChild(SpriteA);
У родителей есть ссылки на своих детей, а у детей есть ссылки на своих родителей, поэтому должен ли я делать все это, чтобы он подходил для GC по подсчету ссылок?
spriteB.removeChild(spriteC);
spriteB.removeEventListener(MouseEvent.CLICK, myCallback);
spriteA.removeChild(spriteB);
stage.removeChild(spriteA);
spriteA = null;
Должен ли я также установить для spriteB и spriteC значение null? А что, если бы spriteC был вместо этого экземпляром класса, который расширяет Sprite и имеет несколько собственных свойств. Должен ли я обнулить их тоже?
spriteB
иspriteC
не будет иметь никакого эффекта. Это локальные переменные функции. Также нет необходимости удалять обработчик событий, потому что сам обработчик не будет удален, но он также не создает зависимости для диспетчера. - person   schedule 21.10.2013