Hier nochmal ein Minimalbeispiel (ich mach beim ARC Zeugs testen seit 10.2 immer gern Programme die ich kurz auf meine Ubuntu VM feuern kann, daher ohne FMX)
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
type
TTest = class(TInterfacedObject)
private
fProc: TProc;
procedure Something;
public
constructor Create;
destructor Destroy; override;
end;
var
destroyCalled: Boolean;
{ TTest }
constructor TTest.Create;
begin
fProc := Something;
(*
actually compiled into
fProc :=
procedure begin
begin
Self.Something; // <- causes Self to be captured
// all captured fields are strong references and thus TTest keeps itself alife
// with the circular reference: fProc <-> Self
end;
*)
end;
destructor TTest.Destroy;
begin
destroyCalled := True;
inherited;
end;
procedure TTest.Something;
begin
end;
procedure Main;
var
intf: IInterface;
begin
intf := TTest.Create;
intf := nil;
Assert(destroyCalled);
end;
begin
Main;
end.
Da anonyme Methoden immer mehr Einzug halten (auch im offiziellen Delphi Code) halte ich diesen Defekt schon für äußerst
kritisch (ja, man kann drumherum arbeiten) gerade da er schon einiges an Wissen über die Interna vorraussetzt.
Also bitte fleißig voten sofern möglich
Und jetzt versuch mal so ein
DOM hinzubekommen, dass unter ARC und NichtARC funktioniert und wo es massig Kreisreferenzen gibt, ohne ein Speicherleck.
Siehe FMX und FireDAC :grusel: