Du musst bei Interfaces die Referenzzählung beachten. Wenn der Referenzzähler 0 erreicht, wird das Objekt automatisch zerstört.
Das kann z.B. passieren, wenn du Klassen- und Interface-Variablen mischt:
Delphi-Quellcode:
type
IMyObj = interface
…
end;
TMyObj = class(TInterfacedObject, IMyObj)
…
end;
var
obj: TMyObj;
intf: IMyObj;
begin
obj := TMyObj.Create; // Referenzzähler von obj ist 0
intf := obj; // Referenzzähler von obj wird inkrementiert → 1
intf := nil; // Referenzzähler von obj wird dekrementiert → 0 → obj wird freigegeben
{ ab hier kannst du obj nicht mehr benutzen }
end
Dabei muss nicht unbedingt eine Interface-Variable auf nil gesetzt werden, es kann auch sein, dass in einer Subroutine ein Objekt einer lokalen Interface-Variable zugewiesen wird. Am Ende der Subroutine wird die Variable nämlich finalisiert, der Referenzzähler wird also ebenfalls dekrementiert, natürlich mit dem selben Effekt.
Deshalb sollte man Interfaces wenn dann immer konsequent verwenden.