Frage

Ich habe ein Wörterbuch, wo ich Daten für Videoclips halten, und ich mag, dass der Datenmüll gesammelt werden, wenn ich die Videoclips nicht mehr verwenden. Ich bin die schwachen Schlüssel-Parameter verwenden, und es funktioniert perfekt mit anderen Daten, aber ich habe auf ein Problem stoßen.

Dieser Code funktioniert gut:

var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
mc = null;
System.gc();
System.gc();
for (var obj in dic)
   trace(obj);    //this doesn't execute

Aber wenn ich tatsächlich die Movieclip verwenden, ist es nicht mehr funktioniert:

var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
addChild(mc);
removeChild(mc);
mc = null;
System.gc();
System.gc();
for (var obj in dic)
   trace(obj);    //this prints [object Movieclip]

Warum geschieht das? Ist es etwas, was ich falsch mache? Gibt es eine Abhilfe?

Edit: Ich weiß, dass für dieses spezielle Beispiel, das ich delete dic[mc] verwenden kann, aber natürlich ist dies eine vereinfachte Fall. Im Allgemeinen möchte ich nicht manuell den Movieclip aus dem Wörterbuch zu entfernen, aber es sollte automatisch sein, wenn ich es nicht mehr in dem Rest der Anwendung verweisen.

Edit2: Ich habe versucht zu testen, was Aaron sagte, und kam mit nur weird stuff up ... nur das Wörterbuch Iterieren (ohne etwas zu tun) ändert das Verhalten:

var mc = new MovieClip();
var dic = new Dictionary(true);
dic[mc] = 12;
addChild(mc);
removeChild(mc);
mc = null;

for (var objeto in dic) {}    // <-- try commenting out this line

addEventListener('enterFrame', f);  // I print the contents every frame, to see if
                                    // it gets removed after awhile

function f(evento)
{
    System.gc();
    System.gc();

    for (var objeto in dic)
        trace(objeto);
}

Das hält den Druck [Objekt Movieclip] bei jedem Rahmen, wenn ich die angegebene Zeile aus kommentieren, wo er nichts drucken.

War es hilfreich?

Lösung

Ich glaube, dass das Problem mit einem Timing ist. Ich glaube, dass, wenn Sie Kind nennen entfernen, wird der Referenzzähler erst später nicht im „Rahmen“ immer aktualisiert. (Ich denke, das ist das, was ohnehin geschieht.)

Der folgende Code zeigt, warum ich denke, das ist wahr. (Ich verwende Flex, aber es scheint, das Problem zu reproduzieren.)

Der folgende Code-Ausgänge:

[object MovieClip]
here

Wenn Sie direkt am Ende des somefoo nennen otherfoo () erhalten Sie:

[object MovieClip]
here
[object MovieClip]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" mouseDown="somefoo()">
<mx:Script>
    <![CDATA[
        import mx.core.UIComponent;
        private var dic:Dictionary = new Dictionary(true);
        private var ui:UIComponent = new UIComponent();
        private var mc:MovieClip = new MovieClip();

        private function somefoo():void {
            this.addChild(ui);

            dic[mc] = 12;
            ui.addChild(mc);
            ui.removeChild(mc);
            for (var obj:Object in dic)
               trace(obj);    //this prints [MovieClip]

            this.removeChild(ui);

                            // callLater causes the function to be called in the _next_ frame.
            callLater(otherfoo);
        }

        private function otherfoo():void
        {
            trace("here");
            mc = null;
            System.gc();
            System.gc();

            for (var obj:Object in dic)
               trace(obj);    //this prints [MovieClip]

        }
    ]]>
</mx:Script>
</mx:Application>

Andere Tipps

Sie sind Beispiel-Code hier sind Sie nie den Movieclip zu dem Wörterbuch hinzufügen, aber der int 12 statt? Wahrscheinlich ein Tippfehler.

Wenn Sie das Wörterbuch wollen, eine Liste haben, was zur Zeit auf der Bühne, warum nicht ich als util Klasse statt, die Event.ADDED_TO_STAGE und Event.REMOVED_FROM_STAGE zuhört und ändern Sie das Wörterbuch entsprechend? Ein Wörterbuch nicht automatisch Verweise löschen, wenn sie von der Bühne entfernt erhalten. Auch gc in diesem Fall hat nichts damit zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top