Referenzzählung einsetzen
Nach oben zu Speicherverwaltung für Schnittstellenobjekte
In diesem Thema ist die Referenzzählung für die Interfaces beschrieben, die von allen Delphi-Compilern unterstützt werden.
Der Delphi-Compiler stellt durch seine Implementierung der Interface-Abfrage und -Referenzzählung einen Großteil der IInterface-Speicherverwaltung bereit. Für ein Objekt, dessen Existenz von seinen Interfaces abhängig ist, können Sie diese Referenzzählung einfach nutzen, indem Sie von TInterfacedObject ableiten. Wenn Sie die Referenzzählung verwenden möchten, dürfen Sie das Objekt nur als Interface-Referenz verwalten. Die Referenzzählung muss konsistent erfolgen. Zum Beispiel:
procedure beep(x: ITest); function test_func() var y: ITest; begin y := TTest.Create; // because y is of type ITest, the reference count is one beep(y); // the act of calling the beep function increments the reference count // and then decrements it when it returns y.something; // object is still here with a reference count of one end;
Dies ist die sicherste Methode der Speicherverwaltung, die bei Verwendung von TInterfacedObject automatisch erfolgt. Wenn Sie diese Regel nicht beachten, kann das Objekt ungewollt freigegeben werden:
function test_func() var x: TTest; begin x := TTest.Create; // no count on the object yet beep(x as ITest); // count is incremented by the act of calling beep // and decremented when it returns x.something; // surprise, the object is gone end;
procedure beep(const x: ITest);
oder
procedure beep(var x: ITest);Diese Deklarationen generieren schnelleren und weniger umfangreichen Code.
Handelt es sich bei dem Objekt um eine Komponente oder um ein Steuerelement, dessen Eigentümer eine andere Komponente ist, dann können Sie die Referenzzählung nicht verwenden, da sie in diesem Fall nicht konsistent erfolgen kann. Sie können hier nach wie vor mit Interfaces arbeiten, sollten die Referenzzählung aber nicht einsetzen, weil die Existenz des Objekts nicht von seinen Interfaces abhängt.