Man muss 4 Fälle unterscheiden.
1.) Von
TInterfacedObject abgeleitet
man darf nur den Interfacezeiger speichern und über das Interface auf das Objekt zugreifen
Delphi-Quellcode:
var
test : IMyInterface; {Interfacezeiger}
myobj : TMyInterfacedObject; {Objektzeiger}
begin
// korrekte Anwendung
test := TMyInterfacedObject.Create;
test.Machwas;
test := nil; // gibt das Objekt autom. frei
// falsch
myobj := TMyInterfacedObject.Create; // (*)
test := myobj as IMyInterface;
test.Machwas;
myobj.MachwasAnderes; // gefährlich
myobj.Free; // verboten!
Man sollte den Objektzeiger in diesem Fall gar nicht erst verwenden.
Das Problem entsteht in der Zeile die mit (*) markiert ist.
2.) Von
TComponent abgeleitete Klasse (
Owner=nil)
gleiche Regeln wie 1.)
3.) Von
TComponent abgeleitete Klasse (
Owner <> nil)
Man darf auf den Objektzeiger zugreifen
Manuelle Freigeben mit Free sollte man vermeiden (dies wird automatisch durch den Owner erledigt)
Wichtig: Bevor der Owner freigeben wurde und damit auch das Objekt, muss man alle Interfacezeiger auf nil setzen
oder die Interfacezeiger müssen zuvor "out-of-Scope" gekommen sein
4.) Klassen mit ausgeschalteter Referenzzählung
Bevor das Objekt freigeben wird, muss man alle Interfacezeiger auf nil setzen
oder die Interfacezeiger müssen zuvor "out-of-Scope" gekommen sein