AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Classes/Interfaces, Reference counting, wann/wie

Ein Thema von renew · begonnen am 23. Jun 2020 · letzter Beitrag vom 23. Jun 2020
Antwort Antwort
renew

Registriert seit: 22. Jun 2020
3 Beiträge
 
#1

Classes/Interfaces, Reference counting, wann/wie

  Alt 23. Jun 2020, 07:22
Hallo,

ich verstehe es nicht ganz, wann das Reference-Counting der Interfaces genutzt wird. Also,

Beispiel:
Code:
  ITest = interface(IInterface)
    procedure CallInterface(testObject: ITest);
  end;

  TTest = class(TInterfacedObject, ITest)
  public
    procedure CallInterface(testObject: ITest);
    procedure CallInstance(testObject: TTest);  
  end;

procedure TForm1.Test();
var
  testInterface: ITest;
  testInstance: TTest;
begin

  // Funktioniert.
  testInstance := TTest.Create;
  testInstance.CallInstance(testInstance);
  testInstance.Free;

  // Interface wirft Fehler, obwohl immer nach TTest gecastet wird
  testInterface := TTest.Create;
  (testInterface as TTest).CallInstance(testInterface as TTest);
  (testInterface as TTest).Free;   // Fehler

  // auch wenn ich mit einer Klasseninstanz arbeite, diese aber an eine Funktion übergeben, die das Interface erwartet, gibt es Fehler.
  // Es wird doch kein neues Objekt erzeugt, sondern nur die Referenz an die Funktion übergeben
  testInstance := TTest.Create;
  testInstance.CallInterface(testInstance);
  testInstance.Free;      // Fehler
 
 end;
Kann mir jemand erklären, wann das Reference-Counting genutzt wird?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.354 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Classes/Interfaces, Reference counting, wann/wie

  Alt 23. Jun 2020, 07:36
Der Thread hier und der verlinkte Artikel bringen vielleicht etwas Licht ins Dunkel:
https://www.delphipraxis.net/195725-...eferenzen.html

Ggf. für den Einstieg:
http://etutorials.org/Programming/ma...ng+Interfaces/
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.296 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Classes/Interfaces, Reference counting, wann/wie

  Alt 23. Jun 2020, 07:37
Es macht keinen Sinn sich so etwas anzutun. In einem Satz: Entweder du referenzierst etwas via Interface und nutzt ARC, oder man referenziert es über Klassentypen und nutzt manuelle Speicherverwaltung.

Schau doch im Debugger einfach mal was genau (testInterface as TTest).Free;// Fehler hier der "Fehler" ist: Hier wirft die Delphi-Bibliothek selbst einen Fehler und meint "Hey Moment, das kann doch überhaupt nicht sein! Es bestehen noch Referenzen auf mich, ich kann mich doch nicht freigeben!":
Delphi-Quellcode:
  if RefCount <> 0 then
    Error(reInvalidPtr);
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
7.619 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Classes/Interfaces, Reference counting, wann/wie

  Alt 23. Jun 2020, 07:55
Kann mir jemand erklären, wann das Reference-Counting genutzt wird?
Wenn du nur mit Interfaces arbeitest:
Delphi-Quellcode:
procedure TForm1.Test();
var
  testInterface: ITest;
begin
  testInterface := TTest.Create;
  testInterface.CallInterface(testInterface);
  testInterface := nil; // zur expliziten Freigabe, ohne die Zeile wird es nach dem end darunter freigegeben
end;
Am einfachsten machst du es dir, wenn du den Klassennamen ausschließlich (!) bei der Erstellung der Instanz mit TTest.Create verwendest. Danach solltest du immer mit ITest arbeiten ohne Casts auf TTest oder Variablen vom Typ TTest.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
renew

Registriert seit: 22. Jun 2020
3 Beiträge
 
#5

AW: Classes/Interfaces, Reference counting, wann/wie

  Alt 23. Jun 2020, 09:06
Danke für die Infos. Werde wohl noch etwas testen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.074 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Classes/Interfaces, Reference counting, wann/wie

  Alt 23. Jun 2020, 11:17
Es gibt ein paar Ausnahmen, z.B.
* bei Interfaces ohne Referenzzählung
* oder wenn man für den Objektzeiger selbst eine Referenz registriert -> AddRef

Ansonsten gibt es eine einfache Regel:
NIEMALS Objektreferenzen mit Interfacereferenzen mischen,
also entweder mit Objekten arbeite oder mit Interfaces (also sein Objekt gleich zu Beginn ausschließlich in einer Interfacevariable speichern)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
769 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Classes/Interfaces, Reference counting, wann/wie

  Alt 23. Jun 2020, 13:04
Es gibt ein paar Ausnahmen, z.B.
* bei Interfaces ohne Referenzzählung
Was meinst Du damit? Ein Interface selber hat doch eh keine Referenzzählung sondern das Objekt. Meinst Du Klassen bei denen der Mechanismus ausgehebelt ist?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.074 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Classes/Interfaces, Reference counting, wann/wie

  Alt 23. Jun 2020, 13:33
Nja, aus Sicht des Benutzers sieht er ja nur das Interface, also wird quasi bei diesem "Interface" gezählt oder nicht.

Viele Objekte hinterm Interface haben eine Referenzzählung, aber ja, wenn man es genau nimmt, dann wählt das Objekt und da gibt es auch Welche ohne Mitzählen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf