Sí que lo llama, sino te lo crees analicemos el código de cada procedimiento:
FreeAndNil:
Código Delphi
[-]procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
llama a Free del objeto que indiques en Obj.
Obj.free:
Código Delphi
[-]procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
Aquí llama al método destroy del propio objeto.
Si te fijas, para que se llame al método destroy existe la condición de que el objeto exista:
Código Delphi
[-]...
if Self <> nil then
...
Así que en conclusión podemos sacar que fallas también a la hora de crear ese objeto, puede que estés cometiendo el mismo error.
Edito:
en la unit2 te faltan los inherited dentro del constructor y destructor.