Referenzzählung einsetzen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Speicherverwaltung für Schnittstellenobjekte


Hinweis: In diesem Thema wird die Referenzzählung für Interfaces, die von allen Delphi-Compilern unterstützt werden, beschrieben. Darüber hinaus unterstützen die mobilen Delphi-Compiler die automatische Referenzzählung auch für Klassen. Weitere Informationen finden Sie unter Automatische Referenzzählung in mobilen Delphi-Compilern.

Der Delphi-Compiler übernimmt durch seine Implementierung der Interface-Abfrage und Referenzzählung einen Großteil der IInterface-Speicherverwaltung. 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, das einer anderen Komponente gehört, 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