TInterfacedObject ist für die Fälle gedacht, wo dein Objekt nach der Initialisierung nur noch über das Interface angesprochen wird, also z.B. ganz abstrakt:
Delphi-Quellcode:
type
ISomeInterface = interface
end;
TSomeInterface = class(TInterfacedObject, ISomeInterface)
end;
var
i: ISomeInterface;
begin
i := TSomeInterface.Create(...) as ISomeInterface;
end;
Ab der Zuweisung kannst du das Objekt (TSomeInterface) vergessen. Du musst es nicht mehr freigeben - das geschieht automatisch, wenn der Referenzzähler 0 erreicht. Delphi erhöht/vermindert diesen Referenzzähler automatisch bei der Übergabe von Parametern und bei der Zuweisung an Variablen, im Beispiel oben würdest du das Objekt also einfach durch:
i := nil;
wieder freigeben. Noch "automatischer" ist dies bei lokalen Variablen, für die Delphi automatisch einen try-finally-Block erzeugt, und die beim Verlassen der Prozedur/Funktion dann automatisch freigegeben werden.
Willst du das nicht, dann solltest du
TInterfacedPersistent als Basisklasse nehmen. Hier muss das Objekt manuell wieder freigegeben werden. Dies ist für Klassen gedacht, die nicht ausschließlich der Implementierung eines Interfaces dienen sondern ein Interface ggf. einfach nur "zusätzlich" implementieren möchten.
Außerdem werfe ich nochmal die beiden Klassen
TAggregatedObject und
TContainedObject ins Rennen, die man als Basisklasse für Objekte mit Interfaces nehmen kann, die zu einem anderen Objekt mit Interface gehören (z.B. Elemente einer Aufzählung) und ihre Referenzzählung an das "besitzende" Objekte delegieren.