Referenzzählung einsetzen

Aus RAD Studio

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;
Hinweis: In den obigen Beispielen erhöht die Prozedur beep der Deklaration entsprechend den Referenzzähler im Parameter (durch einen Aufruf von _AddRef). Dies geschieht bei den folgenden Deklarationen nicht:
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.

Siehe auch