AGB  ·  Datenschutz  ·  Impressum  







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

Frage zu Interfaces

Ein Thema von guidok · begonnen am 3. Mär 2009 · letzter Beitrag vom 4. Mär 2009
Antwort Antwort
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#1

Frage zu Interfaces

  Alt 3. Mär 2009, 15:52
Ich habe noch ein wenig Probleme mit der Handhabung von Interfaces. Der nachfolgende Quellcode stammt aus dem Beispiel von OmniXML. Hier wird ein XMLDoc (was ja ein Interface ist) erzeugt, eine Datei erstellt, gespeichert und Schluss. Freigeben muss man XMLDoc offensichtlich nicht.

Wer gibt XMLDoc, wann frei?

Delphi-Quellcode:
var
  XMLDoc: IXMLDocument;

begin
  XMLDoc := CreateXMLDoc;
  XMLDoc.DocumentElement := XMLDoc.CreateElement('root');
  XMLDoc.DocumentElement.SetAttribute('attr', 'value');
  XMLDoc.Save('document.xml');
end.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Frage zu Interfaces

  Alt 3. Mär 2009, 15:56
Hallo,

Interfaces benutzen intern eine Referenzzählung, um sich selbst zu verwalten und zu zerstören:
Delphi-Quellcode:
var
  XMLDoc: IXMLDocument;

begin
  XMLDoc := CreateXMLDoc; // 1 Referenz -> Zähler = 1
  XMLDoc.DocumentElement := XMLDoc.CreateElement('root');
  XMLDoc.DocumentElement.SetAttribute('attr', 'value');
  XMLDoc.Save('document.xml');
end. // Keine Referenz mehr -> Zähler = 0 -> Objekt wird zerstört
Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#3

Re: Frage zu Interfaces

  Alt 3. Mär 2009, 15:59
Was bedeutet "Keine Referenz mehr"?

Sprich: Wird das Objekt immer am Ende der Prozedur zerstört?

Ich benötige an anderer Stelle ebenfalls Zugriff auf das besagte XMLDoc und möchte daher etwas in dieser Art machen:

Delphi-Quellcode:
type
  TTest = class(TObject)
  private
    FXMLDoc: IXMLDocument;
  public
    procedure ErstelleRoot;
    procedure WeitereKnoten;
  end;

procedure TTest.ErstelleRoot;
begin
  FXMLDoc := CreateXMLDoc;
  FXMLDoc.DocumentElement := FXMLDoc.CreateElement('root');
end;

procedure TTest.WeitereKnoten;
  var
    WeitererKnoten: IXMLElement;
begin
  WeitererKnoten := FXMLDoc.CreateElement('Weiterer Knoten');
  FXMLDoc.DocumentElement.AppendChild(WeitererKnoten);
end;
Wann würde das Objekt in diesem Fall zerstört?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: Frage zu Interfaces

  Alt 3. Mär 2009, 16:00
das Interface zählt praktisch mit, in wievielen Variablen ala "irgendwas: {InterfaceTyp}" es gespeichert ist und sobald es von keiner Variable mehr verwendet wird, zerstört es sich selber.

Delphi erhöht/erniedrigt diesen Zähler jedes mal, du z.B. ein Interface einer anderen Variable zuweißt ":=" oder wenn du Variablen gelöscht werden (z.B. am Ende einer Prozedur)



[add]
Zitat:
Was bedeutet "Keine Referenz mehr"?
wenn es keine Variable mehr gibt, vorin das Interface gepseichert wurde, bzw. wenn es aus den Variablen gelöscht wurde (XMLDoc := nil).

Zitat:
Wann würde das Objekt in diesem Fall zerstört?
wenn du die Instanz TTest freigibst und es sonst keiner Referenzen mehr gibt
$2B or not $2B
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#5

Re: Frage zu Interfaces

  Alt 3. Mär 2009, 17:15
Ah so ist das. Danke für die Info.

Wie ist es, wenn ich die Prozedur aus dem o.g. Beispiel mehrfach aufrufen muss? Sollte ich sinnvollerweise das Interface vorher auf nil setzen?

Delphi-Quellcode:
procedure TTest.ErstelleRoot;
begin
  FXMLDoc := nil; //Interface löschen
  FXMLDoc := CreateXMLDoc;
  FXMLDoc.DocumentElement := FXMLDoc.CreateElement('root');
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: Frage zu Interfaces

  Alt 3. Mär 2009, 17:19
mußt du nicht, bei jedem Aufruf wird ja die interface-Variable neu initialisiert und am Ende freigegeben
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Frage zu Interfaces

  Alt 3. Mär 2009, 19:20
Zitat von himitsu:
mußt du nicht, bei jedem Aufruf wird ja die interface-Variable neu initialisiert und am Ende freigegeben
Er Hat jetzt das Interface als Feld einer Klasse deklariert und nicht mehr als lokale Variable.
Dadurch ist natürlich FXMLDoc u.U. noch gültig. Man braucht es deswegen aber nicht explizit auf nil setzen. Das macht Delphi automatisch für dich.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: Frage zu Interfaces

  Alt 3. Mär 2009, 19:43
wenn er ein neues Interface erstellt (CreateXMLDoc), dann wird das alte aus dieser Variable freigegeben und würde sich demnach auch löschen
$2B or not $2B
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Frage zu Interfaces

  Alt 4. Mär 2009, 14:56
Zitat von himitsu:
wenn er ein neues Interface erstellt (CreateXMLDoc), dann wird das alte aus dieser Variable freigegeben und würde sich demnach auch löschen
Nur wenn es keine anderen Referenzen gibt. Ich würde die Erzeugung z.B. in den Konstruktor verlegen, oder in eine Init-Methode, die vor der Verwendung des XMLDocuments aufgerufen werden muss.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

Re: Frage zu Interfaces

  Alt 4. Mär 2009, 15:01
Zitat von mjustin:
Nur wenn es keine anderen Referenzen gibt. Ich würde die Erzeugung z.B. in den Konstruktor verlegen, oder in eine Init-Methode, die vor der Verwendung des XMLDocuments aufgerufen werden muss.
wenn es noch andere Referenzen gäbe, dann sollte es natürlich auch nicht freigegeben werden.
Aber die Referenz in dieser Variable würde dennoch freigegeben.
$2B or not $2B
  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 19:22 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