Das Problem ist, dass FreeAndNil halt nur für Objekte arbeitet(e).
Jetzt mit der neuen Signatur, wäre eine Unterscheidung zwischen Interface und Objekt möglich. (siehe Post vom Uwe)
Zitat:
Delphi-Quellcode:
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
Rein logisch macht es einfach
Delphi-Quellcode:
procedure FreeAndNil(var Obj);
begin
if Assigned(Pointer(Obj)) then TObject(Obj).Destroy; // TObject(Obj).Free;
Pointer(Obj) := nil;
end;
// OK, eigentlich
begin
try
if Assigned(Pointer(Obj)) then TObject(Obj).Destroy; // TObject(Obj).Free;
finally
Pointer(Obj) := nil;
end;
end;
Und wenn jetzt in Obj aber ein IInterface liegt, dann kann es beim
TObject(Obj).Destroy;
nur Probleme geben.
Also erstmal knallt es und da
Pointer(Obj) := nil;
die Referenzzählung nicht macht,
welche beim
IInterface(Intf) := nil;
eigentlich auch noch intern ein
if Assigned(Pointer(Intf)) then IInterface(Obj)._Release;
ausführen würde.
OK, wenn man die Zählung ignoriert, dann stört es nicht, falls es vorher nicht schon knallen würde.