AGB  ·  Datenschutz  ·  Impressum  







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

Interfaces ohne Referenzzählung?

Ein Thema von idefix2 · begonnen am 18. Okt 2010 · letzter Beitrag vom 19. Okt 2010
Antwort Antwort
Seite 1 von 2  1 2      
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Interfaces ohne Referenzzählung?

  Alt 18. Okt 2010, 12:16
So wie ich es verstanden habe, erfolgt bei allen Klassen, die ein Interface implementieren, eine automatische Referenzzählung, und jede Instanz wird freigegeben, wenn der Referenzzähleer auf null ist. Irgendwie ist mir das nicht ganz geheuer, ivh möchte mich lieber selbst um die Freigabe meiner Objekte kümmern. Gibt es eine Möglichkeit, Interfaces zu verwenden, ohne dass eine automatische Freigabe der Objekte erfolgt.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

AW: Interfaces ohne Referenzzählung?

  Alt 18. Okt 2010, 12:31
Benutze nicht TInterfacedObject und implementiere die entsprechenden Methoden selbst.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Interfaces ohne Referenzzählung?

  Alt 18. Okt 2010, 12:33
Hmmm, also mal sehen was da mit einem normalen TObject passiert:
Delphi-Quellcode:
foo := TMyObject.Create;
foo := nil;
Die Instanz von TMyObject ist jetzt unwiederbringlich verloren ... weil wir haben den Kontakt verloren.
Folge: Speicherleck!
Bei einem Interface kann das nicht passieren, das würde in so einem Fall auch aus dem Speicher entfernt.

Ich verstehe somit nicht, warum du die Referenzzählung ausschalten möchtest.

Es gibt aber die Möglichkeit die Referenzzählung zu beeinflussen, indem du die Klasse einfach von TObject und nicht von TInterfaecObject ableitest. Die Referenzzählung musst du dann selber implementieren.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Interfaces ohne Referenzzählung?

  Alt 18. Okt 2010, 12:50
Bei Komponenten (TComponent-Ableitungen) wird die Freigabe der übergeordneten Komponente überlassen. Die Implementierung dort zeigt wie es gehen kann, ohne dass das Objekt freigegeben wird, auch wenn die letzte Schnittstellenreferenz verschwindet.
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Interfaces ohne Referenzzählung?

  Alt 18. Okt 2010, 13:00
Bei Komponenten (TComponent-Ableitungen) wird die Freigabe der übergeordneten Komponente überlassen. Die Implementierung dort zeigt wie es gehen kann, ohne dass das Objekt freigegeben wird, auch wenn die letzte Schnittstellenreferenz verschwindet.
Wenn ich alle Referenzen entfernt habe, dann hat die übergeordnete Komponente immer noch eine Referenz ... somit ist die Referenzzählung auch nicht auf 0, logisch erfolgt da keine Freigabe, weil de facto nicht alle Referenzen verschwunden sind
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Interfaces ohne Referenzzählung?

  Alt 18. Okt 2010, 14:31
wenn Du eine weniger fette Basisklasse suchst:
TInterfacedPersistent
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: Interfaces ohne Referenzzählung?

  Alt 18. Okt 2010, 15:39
Die Objekte, um die es geht, sind Ableitungen verschiedenster Komponenten, die also normalerweise automatisch gelöscht werden, wenn ihr Owner - das Formular - gelöscht wird.

Das Interface, das ihnen allen gemeinsam ist, enthält z.B. eine function IsValid: boolean
Dazu wird ein Nachkomme von TForm implementiert, der zum passenden Zeitpunkt alle Komponenten des Formulars durchgeht, und bei den Komponenten, die dieses Interface implementieren, die Gültigkeit der Eingabe mittels IsValid prüft.

Nachdem Formularkomponenten ohnehin automatisch richtig freigegeben werden, möchte ich nicht durch die Einführung eines Interface eine völlig überflüssige und u.U. schädliche Referenzzählung zusätzlich haben. Mir ist aber eben nicht klar, für welche Objekte Delphi die automatische Referenzzählung aktiviert. Genügt es, dass irgend ein beliebiges Interface angegeben wird, um die Referenzzählung auszulösen, oder kann ich Interfaces definieren, die das nicht machen?

Klarerweise kann ich nicht von TInterfacedPersistent ableiten, weil es sich eben um Nachkommen von Tedit, tmemo etc. handelt, denen ein zusätzliches, gemeinsames Interface umgehängt werden soll.

Geändert von idefix2 (18. Okt 2010 um 15:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Interfaces ohne Referenzzählung?

  Alt 18. Okt 2010, 15:42
Dann könntest du auch bei Objekten bleiben.

Du leitest alle entsprechenden Komponenten von einem gemeinsamen Vorfahren ab, welcher IsValid als virtuelle Methode implementiert.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Interfaces ohne Referenzzählung?

  Alt 18. Okt 2010, 15:46
Die Referenzzählung erfolgt nicht im Interface, sondern im Objekt das mit dem Interface verbunden deklariert wird. Automatisch implementiert ist das bei TInterfacedObject. Dazu kannst du dir den Quelltext anschauen, wie die Referenzzählung dort umgesetzt ist.

Dann weißt du auch wie man das abstellen kann

(IInterface als Basis-Interface schreibt nur zwingend vor, dass die Methoden für die Referenzzählung implementiert werden müssen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#10

AW: Interfaces ohne Referenzzählung?

  Alt 18. Okt 2010, 16:01
@himitsu
Ich kann die Komponenten nicht von einen gemeinsamen Vorfahren ableiten weil es in Delphi ja keine Mehrfachvererbung gibt. Ich brauch Ableitungen von TEdit, TMemo, TCombobox etc. Und ich will in meinem abgeleiteten Formular einfach isvalid für alle Komponenten aufrufen, die das Interface implementieren (und true für alle anderen annehmen).

@ Sir Rufo
Danke, ich werde mir den Quellcode anschauen. Muss eigentlich ein Interface zwingend von IInterface abgeleitet werden?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:33 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