Hallo Zusammen...
Vor ARC haben wir uns keine sorgen gemacht, oder?
Es wurde eine Objekt erzeugt und wenn wir es nicht mehr gebraucht haben, wurde einfach ein Free aufgerufen.
Dann wurden wir plötzlich entmündigt und ein Free machte nix mehr...
Besonders Fatal bei Sourcecode wo wir uns darauf verlassen haben, dass ein Free auch Freeed...
Delphi-Quellcode:
MyForm := TMyForm.Create;
try
MyForm.Showmodal;
finally
MyForm.Free;
end;
Selbst so simpler Code schließt nicht mehr das Fester, weil komischerweise die Referent nach einem Create nicht 1 ist.
Spätestens das dieser Stelle muss also ein Disposeof her.
Also folgende Procedure geschrieben...
Delphi-Quellcode:
Procedure ArcFree(Var Obj);
{$IF not Defined(AUTOREFCOUNT)}
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
{$ELSE}
begin
if Pointer(Obj) <> NIL then
begin
TFMXObject(Obj).Release;
TFMXObject(Obj).DisposeOf;
end;
TObject(Obj) := nil;
end;
{$ENDIF}
ARC hat sicherlich seine Vorteile, aber eigentlich nur, in Hinblick auf die CrossPlattform Programmierung, wenn uns ARC
@EMBT - BITTE PER COMPILER-SCHALTER!!!
auch unter Windows zur Verfügung steht.
Jetzt habe ich eine [Weak] Referenz und speichere diese an 10000 Stellen in Listen usw.
Wenn dann dieses Object geFreeed wird, müssen alle Pointer aus der Liste auf NIL gesetzt werden.
Warum den nicht so arbeiten wir früher und immer ein ArcFree aufrufen?
Keine Weak-Liste die Speicher verbraucht, keine Performance Einbußen bei einem Free, Fester gehen wirklich zu und mein Code läuft auch ohne ARC-Überlegungen.
Ich rede hier nicht von neuem Code...!
Wenn man etwas neu programmiert, kann man sicherlich die Unterschiede - mal eben
- berücksichtigen.
Grüsse und einen schönen 2. Weihnachtsfeiertag
wünscht Mavarik