Tengo un comentario sobre los que dicen que nunca debe hacer GC manualmente. Estoy acostumbrado a la administración manual de memoria en C++ y prefiero compartir mucho sobre GC, pero de todos modos.
Existe un caso específico en el que no puedo encontrar otra solución que no sea un GC. Considere: Tengo una clase DataCache, la forma en que funciona es que mantiene los objetos de resultados para ciertas llamadas a métodos que envían eventos actualizados al actualizar/recibir datos. La forma en que se actualiza el caché es simplemente limpiar todos los resultados y enviar el evento que causa que los oyentes restantes vuelvan a solicitar sus datos y los oyentes que salieron del alcance no deben volver a realizar la solicitud, lo que elimina los resultados innecesarios. Pero, al parecer, si no puedo obligar a todos los oyentes que todavía cuelgan esperando a que el GC se limpie inmediatamente antes de enviar el evento "preguntar de nuevo a los datos", los oyentes que cuelgan solicitarán datos innecesariamente. Como no puedo eliminar EventListener porque AS3 no tiene destructores, no veo otra solución fácil que forzar un GC para asegurarme de que ya no haya escuchas colgantes.
(Edit) en la parte superior de la que no puedo usar removeEventListener de todos modos por la unión que eran configuración en mxml, por ejemplo (usando mi clase DataCacher costumbre que maneja remoteobj)
<mx:DataGrid id="mygrid" dataProvider="{DataCacher.instance().result('method').data}" ... />
Cuando la ventana emergente que contiene esta cuadrícula de datos está cerrado, esperarías que las ataduras se destruyan. Aparentemente ellos viven y siguen. Hmm, no debería doblar destruir todas las vinculaciones (es decir, eventlisteners) de un objeto cuando está siendo marcado para GC porque se borró la última referencia. Eso solucionaría un poco el problema para mí.
Al menos es por eso que creo, todavía soy un principiante en Flex por lo que cualquier idea sería apreciada.
Esta es una gran respuesta, pero se pierde un punto muy importante. ¡Solo funciona en los depuradores de todos modos! System.gc(): solo para la versión del depurador de Flash Player y las aplicaciones de AIR. En una aplicación de AIR, el método System.gc() solo está habilitado en el contenido que se ejecuta en AIR Debug Launcher (ADL) o, en una aplicación instalada, en contenido en el entorno limitado de seguridad de la aplicación. [http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/System.html#gc()] –
No lo sabía. – Glycerine
En Flash 11 hay un 'Sistema.método pauseForGCIfCollectionImminent() 'puede llamar. Se necesita una discusión para que pueda darle al CG una idea de cuán inminente debe ser una colección para que la pausa suceda. Para más detalles/enlaces, vea mi respuesta a continuación. – pnkfelix