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.