Das bezieht sich auf die Variablen, nicht auf das Objekt dahinter. Wenn du eine Interface-Variable auf nil setzt (oder Finalize(..) aufrufst oder was immer) verringerst du den Referenzzähler. Und erst wenn der auf null geht, wird das Objekt freigegeben.
Das gleiche bei Arrays, Strings, usw.
Beispiel:
Delphi-Quellcode:
program Project5;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils;
var a, b: IInterface;
begin
a := TInterfacedObject.Create();
b := a;
WriteLn( TInterfacedObject(b).RefCount ); // 2
Finalize(a);
Assert( not Assigned(a) );
Assert( Assigned(b) );
WriteLn( TInterfacedObject(b).RefCount ); // 1
Assert( Supports(b, IInterface, {out} a) );
Assert( Assigned(a) );
WriteLn( TInterfacedObject(b).RefCount ); // 2
end.