Einzelnen Beitrag anzeigen

Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Destroy wird ohne Aufruf ausgeführt - total strange...

  Alt 14. Aug 2008, 11:25
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat