Aqui vienen algunas formas de liberar una clase y me gustaria saber cual es la mejor forma y la mas adecuada.
No hay una forma mejor ni más adecuada, para todos los casos. Depende de cómo manejes tus objetos.
Por ejemplo, si eres cuidadoso y solo creas y destruyes tus objetos una vez y de forma controlada; basta con que uses el constructor Create() para crear a los objetos y llamar al destructor Destroy() para destruirlos. Esa sería la forma estándar.
En algunos esquemas, como cuando se quieren reusar variables que apuntan a objetos, puede convenir saber si un objeto se ha liberado (si se le ha aplicado un "Destroy"). Para eso se podría usar una variable auxiliar (lo que complicaría el programa), o usar la misma variable del objeto como bandera y asignarle un valor nulo (que en Pascal es NIL) cuando se ha liberado.
Pero llamar a un Destroy() , no pone a NIL la variable del objeto, por eso es que se suele hacer:
objeto.Destroy;
objeto := nil;
Luego para evitar liberar objetos ya liberados, se tendría que usar:
if A <> nil then begin
A.Destroy;
A := nil;
end;
Y como eso es una tarea común, ya existe un procedimiento creado llamado FreeAndNil(). Si tienes más curiosidad sobre FreeAndNil(), puedes ver desde Lazarus, la implementación de ese procedimiento.
También se puede liberar usando objeto.Free, pero hasta donde recuerdo, es similar a Destroy().
Muchos programadores no quieren complicarse y usan a FreeAndNil() para todo. Y eso está bien, funciona. Ellos no quieren ponerse a pensar en qué caso se debe usar FreeAndNil() o Destroy().
Personalmente a mi me gusta usar Destroy() en la mayoría de casos y solo usar FreeAndNil() cuando sea necesario dejar a NIL la variable objeto.