Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Interfaces - freigabe (https://www.delphipraxis.net/162886-interfaces-freigabe.html)

Highttower 8. Sep 2011 15:30

Delphi-Version: 2007

Interfaces - freigabe
 
Hallo zusammen,

ich habe eine Verständnisfrage zu Interfaces in Delphi, und deren Freigabe dazu folgender kleiner Code ausschnitt

Delphi-Quellcode:
type
   IMyInterface = interace
    ....
   end;

   TMyImplementation = class (TInterfacedObject, IMyInterface )

   end;

   implementation

   function CreateTollesInterface : IMyInterface
   begin
   ....
   result := IMyTollesInterface.Create;
   end;

Verstehe ich das bisher richtig:

Jedesmal wenn CreateTollesInterface eine Instanz der Klasse TMyImplementation erstellt, wird der FunktionsPointer von CreateTollesInterface mit in die References geschrieben und somit wird das Interface nie weg geräumt(refCount ist immer 1 weil Funktion global ist)?

Ich hoffe mich versteht jemand, falls ja Danke schon mal. ;)

Stevie 8. Sep 2011 17:15

AW: Interfaces - freigabe
 
Nein, jedesmal, wenn eine Zuweisung eines Interfaces stattfindet, wird _AddRef aufgerufen und wenn die Variable den Scope verliert, wird _Release aufgerufen. (Technisches Detail: Dafür ist die procedure _IntfCopy aus der System.pas zuständig, deren Aufruf der Compiler an die richtigen Stellen bastelt) Außerdem hast du einen (ich vermute Tippfehler) in deinem Source, es muss
Delphi-Quellcode:
result := TMyImplementation.Create;
heißen.

Ablauf bei deinem Beispiel (vereinfacht):

- TMyImplementation instanz wird erzeugt
- Instanz wird auf result zugewiesen (QueryInterface wird aufgerufen, um zu schauen, ob TMyImplementation IMyInterface implementiert.
- _AddRef wird aufgerufen -> RefCount = 1
- Rückgabe Ergebnis von CreateTollesInterface wird in einer Variablen gespeichert

Solange diese Variable gültig ist (bei einer lokalen Variable z.B. bis zum Ende der Routine) bleibt der RefCount auf 1 (oder noch erhöht, durch weiteres Zuweisen). Verliert sie den Scope, wird _Release aufgerufen. Sinkt der RefCount wieder auf 0, wird Free aufgerufen. (sofern von TInterfacedObject abgeleitet)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz