2009-07-16 6 views
2

Angenommen, ich habe eine Klassensammlung, die eine Liste von Elementen enthält.Sollte ich mir in diesem Fall Sorgen um die Freigabe von Ressourcen machen?

Ich habe mehrere Instanzen dieser Collection-Klasse, die alle verschiedene MyLists haben, aber einige Elemente teilen. Zum Beispiel: Es gibt 10 Items, Collection1 Referenzen Items 1-4, Collection2 hat Items 2-8 und Collection3 4,7,8 und 10 auf seiner Liste.

Ich habe dies wie folgt implementiert: Ich habe eine globale Liste, die alle verfügbaren Elemente enthält. Bevor ich eine neue Sammlung erstelle, überprüfe ich, ob es bereits Elemente gibt, die ich in dieser Liste brauche - wenn nicht, erstelle ich das Element und füge es der globalen Liste (und natürlich der Sammlung) hinzu.

Das Problem, das ich sehe, ist, dass diese Elemente nie veröffentlicht werden - auch wenn alle Sammlungen weg sind, wird der Speicher, den sie verbrauchen, immer noch nicht freigegeben, weil die globale Liste immer noch darauf verweist. Ist das etwas, worüber ich mich Sorgen machen muss? Wenn ja, was soll ich tun? Ich dachte daran, der globalen Liste einen Zähler hinzuzufügen, um zu sehen, wann ein Artikel nicht mehr benötigt wird, und seine Referenz zu entfernen.

Bearbeiten: Es ist in der Tat ein Design-Problem, denke ich. Ich werde die Idee einer globalen Liste verwerfen und stattdessen alle Sammlungen durchlaufen und sehen, ob sie das benötigte Objekt bereits haben.

Antwort

1

Es sieht wie ein Designproblem aus, brauchen Sie wirklich die globale Liste?

Abgesehen von den schwachen Referenzen, die Jon erwähnt, könnten Sie die globale Liste auch regelmäßig neu erstellen (zum Beispiel nach dem Löschen einer Sammlung) oder sie nur dynamisch erstellen, wenn Sie sie brauchen, und sie dann wieder freigeben.

Sie müssen entscheiden, welche Methode am besten geeignet ist, wir haben hier nicht genügend Kontext.

2

Wenn die globale Liste Verweise auf die Elemente benötigt, können Sie diese nicht realistisch freigeben. Brauchen Sie wirklich Verweise auf die Einträge in der globalen Liste? Wann sollten Sie logisch Objekte aus der globalen Liste entfernen können?

Sie könnten in der globalen Liste weak references verwenden und die Werte in regelmäßigen Abständen selbst löschen, wenn ihre Referenzen gesammelt wurden.

+0

Danke für die Erwähnung schwacher Referenzen - ich wusste nichts über sie. Aber ich glaube nicht, dass sie für mein Problem relevant sind. – CaptainProton