Hay varias discusiones en torno a FreeAndNil, argumentos a favor y en contra. Depende la situación, a veces en un escenario particular conviene no utilizarlo.
Resumiendo, Free libera al objeto y FreeAndNil además de liberarlo le asigna Nil al puntero.
Ejemplo:
var
objeto : TBitmap;
begin
objeto := TBitmap.Create;
//... Se hace algo con el objeto ...
objeto.Free;
if Assigned (objeto) then
ShowMessage ('Sí, está asignado.')
else ShowMessage ('No está asignado');
end;
Esto mostrará 'Sí, está asignado'.
Con FreeAndNil:
var
objeto : TBitmap;
begin
objeto := TBitmap.Create;
//... Se hace algo con el objeto ...
FreeAndNil (objeto);
if Assigned (objeto) then
ShowMessage ('Sí, está asignado.')
else ShowMessage ('No está asignado');
end;
Esto mostrará 'No está asignado'.
Conclusión final: en la mayoría de los casos usar solo Free es correcto y también lo es usar FreeAndNil.
Este es el procedimiento FreeAndNil:
procedure FreeAndNil(var obj);
var
temp: tobject;
begin
temp:=tobject(obj);
pointer(obj):=nil;
temp.free;
end;
Como curiosidad aunque algo lógico, primero le asigna nil y luego hace el Free por razones más que obvias, digo curioso porque podría llamarse NilAndFree.
No hay comentarios:
Publicar un comentario