AGB  ·  Datenschutz  ·  Impressum  







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

Classes/Interfaces, Reference counting, wann/wie

Ein Thema von renew · begonnen am 23. Jun 2020 · letzter Beitrag vom 24. Jul 2020
Antwort Antwort
Seite 1 von 2  1 2      
renew

Registriert seit: 22. Jun 2020
20 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Classes/Interfaces, Reference counting, wann/wie

  Alt 23. Jun 2020, 08: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
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 23. Jun 2020, 08: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
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 23. Jun 2020, 08: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
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.587 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 23. Jun 2020, 08: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
20 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

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

  Alt 23. Jun 2020, 10: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
44.071 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 23. Jun 2020, 12: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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 23. Jun 2020, 14: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
44.071 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 23. Jun 2020, 14: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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#9

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

  Alt 24. Jul 2020, 11:37
@renew auf Coding Bott gibt es übrigens ein Video zum Thema reference counting:
https://www.youtube.com/watch?v=wrnyJW6dtgY
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 24. Jul 2020, 19:46
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.
Oder man verwendet TTest gar nicht. Bei uns werden diese meist in anderen units gehalten wie die interfaces oder im implementation-Teil der unit und die Erzeugung geht über eine Factory-Methode oder gleich über den DI-Container.
  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 07:34 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