Ich werde nur @ Juan Antwort verfolgen - GC muss von Grund auf als ein kritischer Aspekt des Anwendungsdesigns betrachtet werden. Wenn Sie ein Objekt erstellen, müssen Sie sich über jeden Verweis darauf im Klaren sein und jede Referenz entfernen und annullieren, um sie richtig zu kennzeichnen. Wenn Sie dieses Objekt im Array referenzieren, zählt das, wenn Sie es in einem Listener referenzieren, das zählt, wenn Sie es über eine lokale Variable referenzieren, das zählt auch (obwohl nur während der Lebensdauer der Funktion), wenn es einfach in der Display-Liste, die definitiv zählt, und weiter und weiter.
Ich gehe so weit zu schreiben meine remove Listener-Anweisungen vor dem Hinzufügen von ihnen nur um sicherzustellen,.
Ich werde fast immer eine öffentliche destroy() -Methode für jedes Objekt schreiben, um innere Objekthierarchien zu behandeln (Elternanrufe zerstören auf Kind, die ihrerseits Aufrufe an Kindern usw. zerstören). Das Entfernen/Nullen eines Elternteils, ohne dies für jedes Kind zu tun, ist eine schlechte GC-Verwaltung.
Und wenn Sie tatsächlich Bedenken haben, dass mem Leck aufgetreten ist, verfolgen Sie System.totalmemory nur um sicherzugehen:
var mem:String = Number(System.totalMemory/1024/1024).toFixed(2) + ‘Mb’;
trace(mem); // eg traces “24.94Mb”
Meist - nur um es methodisch sein - es ist nicht Raketenwissenschaft, aber man muss vorsichtig sein.
Beifall -
@ und auch wenn Sie das tun, macht Blitz seine eigene Meinung darüber, wann bis zu einen Sweep tatsächlich tun. Das Beste, was wir tun können, ist sicherzustellen, dass ein Objekt richtig markiert ist und Vertrauen, dass es effizient behandelt wird.
Ist das eine Hausaufgabenfrage oder so? – davr
Nein, aber ich habe es irgendwie wie einen haha gestellt ... Die Idee ist, ein gutes 'Goto'-Beispiel zu haben, wenn man allgemein über Speicherlecks nachdenkt. Ein gutes "Anti-Pattern" sozusagen. – Skawful