Zitat von
s.h.a.r.k:
Ich bin nun einfach mal so dreist und nutze deinen Quellcode, da der als Beispiel sehr gute passt
...ich schreibe dann mal weiter...
Wie ich oben schon schrieb: wenn das Objekt nur das Interface implementieren soll, dann benutze auch nur das Interface und nicht die Referenz auf das Objekt (s.u.). Solche zählenden Interfaces werden
automatisch freigegeben, sobald sie nicht mehr benötigt werden.
Variante 1 wäre also einfach,
ISomeInterface an Stelle von
TSomeInterface zu benutzen:
Delphi-Quellcode:
procedure blaaa(aObject: TObject);
var
tmp : ISomeInterface; // <-!
begin
tmp := TSomeInterface.Create();
tmp.registerObject(blub);
// hier kommt nun die tolle Stelle
//FreeAndNil(tmp); // <-!
end;
Soll dein Objekt die Schnittstelle nur "nebenbei" mit implementieren, also nicht hauptsächlich oder ausschließlich dem Interface dienen, dann solltest du ganz einfach von
TInterfacedPersistent (oder TComponent) ableiten:
Delphi-Quellcode:
TSomeInterface = class(TInterfacedPersistent, ISomeInterface) // <-!
public
FVar : TObject;
procedure registerObject(aObject: TObject);
end;
Es hängt also davon ab, welchen Zweck dein Objekt bzw. dein Interface erfüllen soll.
Von TInterfacedObject abgeleitete Klasse sind -wie oben schon geschrieben- eigentlich für die ausschließliche Verwendung als Interfaces gedacht. Das Problem ist die Referenzzählung, die das Objekt automatisch freigibt, sobald der Zähler auf 0 abfällt (nachdem er mindestens ein Mal auf 1 hochging):
Delphi-Quellcode:
var
T: TSomeInterface;
I: ISomeInterface;
begin
T := TSomeInterface.Create; // Zähler: 0
I := T as ISomeInterface; // Zähler: 1
I := nil; // Zähler: 0 --> Objekt wird freigegeben
// ab hier ist T nicht mehr gültig
end;
Merkregel: Nachdem du ein von TInterfacedObject abgeleitetes Objekt einmal als Interface benutzt hast, solltest du es nicht mehr über die Objektreferenz ansprechen.
Zitat von
s.h.a.r.k:
PS: Kennst du ein gutes Tutorial oder dergleichen, wo man das nachlesen kann?! Habe bisher eben noch kein gutes gefunden, wo drin stehst was wann und warum passiert!?
Tut mir leid, ein gutes Tutorial dazu habe ich auch noch nicht gefunden.