Ich bin immer noch ein Neuling, und ich weiß, dass mein Denken falsch ist; Ich weiß einfach nicht wo ...
Fast alles in Delphi stammt von TObject ab. Was, wenn alles stattdessen von einem TInterfaceObject abstammt, das eine triviale Schnittstelle implementiert hat (z. B. "INamable", mit einer einzigen Methode, die die Namenszeichenfolge einer Klasse zurückgegeben hat)? Da TObject bereits über eine Eigenschaft verfügt, die eine Namenszeichenfolge zurückgibt, müssen Sie keinen zusätzlichen Klassen hinzufügen.
Mit anderen Worten würde ein TInterfacedObject von TObject (oder etwas, das in der Hierarchie ganz oben liegt) erben, und alles, was gerade von TObject abstammt, würde nun von dieser neuen Klasse abstammen. Würde das nicht bedeuten, dass jetzt alles gezählt wurde?
Wenn Sie herausfinden, wo mein Wissen fehlt, würde ich gerne lernen. Danke, wie immer - Al C.
Es ist nicht klar, ob Sie fragen:
Würde das nicht bedeuten, dass jetzt alles gezählt wurde?
Ja, würde es.
Sie möchten jedoch nicht unbedingt, dass alles gezählt wird: jede kleine ganze Zahl, jeder String, jeder boolesche Wert, jedes Element in einem Array ... wenn schon aus anderen Gründen Die Implementierung der Ref-Zählung fügt einen zusätzlichen Aufwand hinzu, z ein wenig mehr Speicher pro Objekt, vielleicht unbedeutend für große Objekte, aber proportional signifikanter, wenn es auf jedes winzige Objekt angewendet wird.
Siehe auch Garbage Collector für Delphi-Objekte und -Komponenten , in dem (Zitat),
stehtDelphi bietet drei Möglichkeiten der Objektverwaltung:
- Erzeuge / zerstöre die Objekte mit try..finally.
- Verwenden Sie TComponent-Nachkommen - erstellen Sie eine Komponente und lassen Sie sie vom Eigentümer freigeben.
- Interfaces - Wenn der Referenzzähler für eine Schnittstelle 0 wird, wird der Objekt, das es implementiert ist zerstört.
Die Delphi-Hilfe sagt, Sie sollten nicht mischen der TComponent Owner Ansatz mit dem Schnittstellenspeicherverwaltung, aber ...
Wäre das eine Garbage Collection?
Nicht ganz; bloße Referenzzählung ist nicht so robust wie Müllsammlung:
Wenn Sie bei der Referenzzählung zwei referenzierte Instanzen haben, die jeweils einen Verweis auf die andere enthalten, werden sie nicht automatisch freigegeben. Um sie freizugeben, müßten Sie diesen 'Zirkelverweis' brechen (d. H. Explizit einem von ihnen mitteilen, seinen Verweis auf den anderen freizugeben).
Bei einer echten Garbage-Collection würde der Garbage-Collector bemerken, dass diese beiden Bereiche von keiner anderen Stelle aus referenziert werden und beide freigeben.
Aktualisieren
Wenn Sie Ihre potenziellen Zirkelverweise als [weak]
-Referenzen annotieren, werden sie in Ordnung zerstört. Aber vor Delphi 10.1 Berlin funktioniert das nur in den NexGen-Compilern (d. H. Denen, die LLVM unter der Haube verwenden). Ab 10.1 Berlin funktionieren diese [weak]
Referenzen überall.
Es würde keine Garbage-Collection funktionieren, da Interfaces ein sehr einfaches System zum Zählen von Referenzen verwenden und zirkuläre Referenzen, die in Delphi-Code sehr häufig vorkommen, brechen das einfache Ref-Zählen.
Nein, wegen zweier Dinge:
Die Müllsammlung unterscheidet sich von der einfachen Ref-Zählung. Sie können eine automatische Löschung durchführen, wenn eine ref-Zählung 0 erreicht. Dies ist jedoch keine Garbage Collection. Garbage Collection bedeutet, dass Sie die Kontrolle über die Löschung von Daten aus dem Speicher verlieren und die Implementierung der zugrunde liegenden Sprache die Behaviours optimieren können. Sie hören auf, auf die Anzahl der Referenzen zu achten, und vertrauen auf das dynamische Verhalten einer bestimmten Implementierung der Garbage Collection.
Natürlich verwendet die Garbage Collection ein Referenzzählsystem, um zu wissen, wann etwas nicht mehr referenziert wird, aber das ist ein kleiner Teil des Puzzles.
Referenzzählung ist eine Form der Speicherbereinigung, aber keine sehr gute. Es wird von einigen Sprachen verwendet (Python denke ich), obwohl oft mit Zykluserkennung.
Selbst wenn Sie von TInterfaceObject abstammen, wird das Objekt nicht gezählt, und daher wird Garbage gesammelt, es sei denn, Sie verwenden nur die Schnittstellenreferenz und nicht die Objektreferenz.
i.e. Sie müssten
verwenden %Vor%Dies bedeutet, dass Ihre Schnittstelle bereits die Methoden und Eigenschaften unterstützen muss, die Sie benötigen, was schnell langweilig wird, da Sie für jede Klasse eine Schnittstelle erstellen müssen.
Es kann jedoch relativ einfach in D2009 oder später gemacht werden. Siehe Barry Kellys Einsatz von intelligenten Zeigern . Die üblichen Reference Countng Cities gelten jedoch.