Garbage Collector – Gambiarra para forçar a passagem – AS3

Acho que todo mundo que programa em action script 3 sabe como é chato o lance de Garbage Collector, ele passa quando quer e olhe lá.
Você pode remover os Listeners, remover o child mas mesmo assim o objeto fica na memória, se der um trace dentro do movieclip ele ainda aparece, mas temos uma gambiarra que pode ajudar a remover esses lixos da memória, basta utilizar o código abaixo:

try {
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
} catch (e:*) {}

O que ele faz é tentar um localConnection 2 vezes seguidas, como irá falhar nas 2 vezes, na segunda vez ele chama o garbage collector, não me pergunte porque isso funciona, mas funciona.
Esse código não causa erro nem nada e é muito útil.

Abaixo um exemplo disso:

O código usado foi o seguinte:

import flash.events.Event;
import flash.display.MovieClip;

criarBTN.addEventListener(MouseEvent.CLICK , onCriar);
removerBTN.addEventListener(MouseEvent.CLICK , onRemover);
gambiarraBTN.addEventListener(MouseEvent.CLICK , onGambiarra);

function onCriar(event:Event):void
{
       //cria um moviclip de estrela e passa o campo de saida como argumento apenas para dar saída no texto
	var temp:EstrelaMC = new EstrelaMC();
	temp.saida = saidaTXT;
	areaMC.addChild(temp);
	temp.x = Math.random() * 350;
	temp.y = Math.random() * 100;
	temp = null;
}
function onRemover(event:Event):void
{
        //Remove todas as estrelas
	while (areaMC.numChildren > 0)
	{
		areaMC.removeChildAt(0);
	}
	saidaTXT.text = "Limpando os movieclips \n";
}
function onGambiarra(event:Event):void
{
        //Chama a gambiarra para limpar a memória
	saidaTXT.text = "Gambiarra Executada - Memória Limpa\n";
	try
	{
		new LocalConnection().connect('foo');
		new LocalConnection().connect('foo');
	}
	catch (e: * )
	{
	}
}

Como mostrado, mesmo retirando as estrelas, os movieclips ainda continuam na memória, executando as instruções.
É isso ae, até a próxima, espero que não demore mais um ano.

Share

So, what do you think ?