2010-11-22 5 views
0

Ich habe eine TitleWindow-Komponente, die ich über PopUpManager.addPopUp() anzeigen. Wenn ich die Komponente zu schließen, bin ich das closePopUp Ereignis aufrufen, die die Objekt Variable setzt auf null, wie folgt:Flex 4: Garbage Collection funktioniert nicht

// application 
private var myObject:MyObject; 

private function openPopUp():void 
{ 
    myObject = new MyObject(); 
    myObject.addEventListener('closePopUp', closePopUp); 
    PopUpManager.addPopUp(myObject, this, true); 
} 

private function closePopUp(e:Event):void 
{ 
    myObject = null; 
} 

jedoch im Debug-Modus kann ich sehen, myObject auf null gesetzt werden, aber die Speichernutzung doesn‘ t verringern. Wenn ich die Komponente erneut öffne, bleibt die Speichernutzung die gleiche wie zuvor.

Ich hätte gedacht, wenn die Variable myObject auf Null gesetzt ist, recycelt GC das Objekt und gibt Speicher frei. Irgendeine Idee, warum das nicht passiert?

+1

im Debug-Modus können Sie versuchen, System.gc() aufzurufen, um Garbage Collection zu erzwingen (aber nicht in Release). – alxx

Antwort

4

Versuchen Sie, den Ereignis-Listener zu entfernen. Ich denke, wenn er dort hängen bleibt, wird der GC daran gehindert, Ihr Objekt zu sammeln.

+0

Nein, das ist ein Mythos. Siehe [hier] (http://gingerbinger.com/2010/07/actionscript-3-0-events-the-myth-of-useweakreference/) oder [hier] (http://stackoverflow.com/questions/10290298/actionscript-3-do-self-event-Listener-Verhindere ein Objekt-from-being-garbage-col). – nwellnhof

3

Die Speicherbereinigung in Flash Player ist keine exakte Wissenschaft und funktioniert etwas anders als das, was die meisten Leute erwarten ... Um es zusammenzufassen, es gibt nur Speicher frei, wenn es mehr benötigt. Diese Artikel erklären es mit mehr Details:

http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html http://blogs.adobe.com/aharui/2007/03/garbage_collection_and_memory.html

Auch, wie Dein sagt, die Ereignis-Listener sind die häufigste Ursache für Speicherlecks in Flash. Sie müssen sehr vorsichtig sein und immer versuchen, sie zu entfernen.