AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Interfaces - freigabe

Ein Thema von Highttower · begonnen am 8. Sep 2011 · letzter Beitrag vom 8. Sep 2011
Antwort Antwort
Highttower

Registriert seit: 2. Jun 2009
Ort: Worms
88 Beiträge
 
Delphi 2010 Professional
 
#1

Interfaces - freigabe

  Alt 8. Sep 2011, 16:30
Delphi-Version: 2007
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.
Tobi
Rechtschreib und Semikolion Fehler dürfen behalten werden.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Interfaces - freigabe

  Alt 8. Sep 2011, 18:15
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 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)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 8. Sep 2011 um 18:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:46 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