AGB  ·  Datenschutz  ·  Impressum  







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

Wann is Class von TObject abgeleitet (FreeAndNil)

Ein Thema von norwegen60 · begonnen am 29. Mär 2020 · letzter Beitrag vom 30. Mär 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Wann is Class von TObject abgeleitet (FreeAndNil)

  Alt 29. Mär 2020, 23:38
In etwas neueren Delphis, wenn für Nextgen mit ARC kompiliert, dort gibt es Weak-Referenzen, die automatisch auf NIL gesetzt werden, wenn das Objekt freigegeben wird.

Erstmal werden beim ARC die Referenzen gezählt und das Objekt die Instanz des Objektes wird erst freigegeben, wenn alle Variablen weg sind.
Free, FreeAndNil und Destroy machen dort absolut garnichts (ja, das ist ein extrem blödes Verhalten und der Mist mit dem DisposeOf ist schwachsinn)

Jedenfalls gibt es dort das Attribut [Weak] , was auch extrem krank ist, denn das Attribut kann man auch bei Nicht-ARC angeben, aber es wird dort ohne Fehlermeldung einfach still und heimlich ignoriert. (ja, ich würde den Erfinder gern mal grün nd blau hauen, aber so richtig)

Delphi-Quellcode:
{$IFNDEF AUTOREFCOUNT} {MESSAGE Fatal 'du kommst hier net rein'} {$ENDIF}

var
  x, y: TObjekt;
  [Weak] z: TObjekt;

x := TObject.Create;
y := x; // diese Referenz wird gezählt
z := x; // diese Weak-Referenz wird nicht gezählt und automatisch NIL
if z = nil then ; // nee

x := nil; // das automatische x.Free, aber da Y noch existiert
y := nil; // jetzt wirklich das automatische Free und Z wird genilt
if z = nil then ; // jupp, ist auch weg


Im Prinzip bekommt die Objektinstanz hier eine Adress-Liste wo alle Weak-Referenzen liegen und beim Destroy werden sie auf NIL gesetzt.



Bei ARC muß man extrem aufpassen keine Kreisreferenzen zu bekommen
Delphi-Quellcode:
type
  TChild = class;

  TOwner = class
    FChild: TChild; // oder gat viele Childs
  end;

  TChild = class
    [Weak] FTOwner: TOwner;
  end;
Ohne WEAK würden im ARC sich die beiden Instanzen gegenseitig halten, selbst wenn es extren keine Referenzen/Variablen mehr gibt.
Im Prinzip arbeiten alle Objekte dort wie Interfaces.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (29. Mär 2020 um 23:45 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 08:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz