• Тимохов Дима © (27.10.18 00:03) [0]
    Приветствую!

    Как вы думаете, почему:

    procedure FreeAndNil(var Obj);



    а не

    procedure FreeAndNil(var Obj: TObject);



    ?

    PS Переводил старый код на интерфейсы, ну и влетел - компилятор проглотил FreeAndNill для интерфейса... со всеми вытекающими.
  • vuk © (27.10.18 00:31) [1]
    А ты попробуй объявить так, как ты написал и посмотри, что скажет компилятор.
  • Германн © (27.10.18 02:32) [2]

    > Тимохов Дима ©   (27.10.18 00:03)  

    Возможно в первую очередь стоит задуматься над тем, "А нафига вообще нужна процедура FreeAndNil"? Чем не  устраивает метод Free?
  • Германн © (27.10.18 02:44) [3]
    Имхо, FreeAndNil придумали троешники для себя и себе подобных. Ибо она нужна для тех случаев, когда автор программы не может контролировать процесс создания и уничтожения объектов.
  • Eraser © (27.10.18 05:05) [4]
    под FMX, чтобы избежать граблей в самом неожиданном месте желательно везде использовать FreeAndNil. ибо в FMX ARC вроде как есть, а вроде как и нету. в ios и android есть, в mac и win - нету.

    вот еще сегодняшний пост Марко по теме http://blog.marcocantu.com/blog/2018-october-Delphi-ARC-directions.html
  • Тимохов Дима © (27.10.18 10:15) [5]

    > vuk ©   (27.10.18 00:31) [1]
    > А ты попробуй объявить так, как ты написал и посмотри, что
    > скажет компилятор.

    мудро, не подумал)))
    спасибо.
  • asail © (28.10.18 20:03) [6]

    > vuk ©   (27.10.18 00:31) [1]
    > А ты попробуй объявить так, как ты написал и посмотри, что
    > скажет компилятор.

    А что не так с тем, что он написал?
    Мне на такой вот код компилятор ничего не говорит:
    procedure FreeAndNil(var Obj: TObject);
    begin
     SysUtils.FreeAndNil(Obj);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
     O: TObject;
    begin
     O := TObject.Create;
     try
       ShowMessage(O.ClassName);
     finally
       FreeAndNil(O);
     end;
    end;


    Д6, если что...
  • vuk © (28.10.18 20:40) [7]

    > asail ©   (28.10.18 20:03) [6]
    > А что не так с тем, что он написал?
    > Мне на такой вот код компилятор ничего не говорит:


    Надо пробовать с переменными типа, отличного от TObject.
  • KSergey © (29.10.18 10:52) [8]
    > Германн ©   (27.10.18 02:32) [2]
    > Возможно в первую очередь стоит задуматься над тем, "А нафига
    > вообще нужна процедура FreeAndNil"? Чем не  устраивает метод Free?

    Слюшай, э, зачем так катигарична, а?! порой вполне по делу.
    Бывают ведь пулы объектов, бывают просто пересоздания объектов с временем жизни более, чем одна функция/метод. И здесь признак if Assigned(myObj) вполне себе удобен
  • KSergey © (29.10.18 10:57) [9]
    > vuk ©   (28.10.18 20:40) [7]
    > Надо пробовать с переменными типа, отличного от TObject.

    Ничто не мешало сделать тут magic-костылёк в компиляторе как в некоторых других местах. Зато было бы избегнуто тьма проблем в мире.
    Но за пояснение - да, спасибо.

    Помнится еще светлой памяти АП возмущался такой недоработке с параметром FreeAndNil
  • картман © (29.10.18 11:05) [10]
    Free, FreeAndNull - они стоят такого количества разговоров вокруг себя?
  • KSergey © (29.10.18 11:46) [11]
    > картман ©   (29.10.18 11:05) [10]
    > Free, FreeAndNull - они стоят такого количества разговоров вокруг себя?

    Несколько странен ваш вопрос.
    Не мы выбираем что стоит, а что нет; но гугль позволяет получать статистику волнующих население вопросов.
  • картман © (29.10.18 12:22) [12]

    > KSergey ©   (29.10.18 11:46) [11]

    перефразирую вопрос:
    почему людей любят обсуждать шелуху? Конкретно эти две процедуры - ну не начхать ли на них? Они вообще никакого отношения к сложности реализации проектов не имеют - так стоят ли они затраченного на их обсуждение времени?
  • KSergey © (29.10.18 12:53) [13]
    К сложности - не имеют.
    А вот к падучести - имеют самое прямое.
    А падучесть её сразу видно, во и приходится озабачиваться пока все эти моменты не разузнал и не стал всё это учитывать при "реализации сложных проектов".
  • asail © (29.10.18 15:32) [14]

    > vuk ©   (28.10.18 20:40) [7]
    > Надо пробовать с переменными типа, отличного от TObject.

    А, понял... Ступил.
  • Германн © (30.10.18 01:35) [15]

    > KSergey ©   (29.10.18 10:52) [8]
    >
    > > Германн ©   (27.10.18 02:32) [2]
    > > Возможно в первую очередь стоит задуматься над тем, "А
    > нафига
    > > вообще нужна процедура FreeAndNil"? Чем не  устраивает
    > метод Free?
    >
    > Слюшай, э, зачем так катигарична, а?! порой вполне по делу.
    >
    > Бывают ведь пулы объектов, бывают просто пересоздания объектов
    > с временем жизни более, чем одна функция/метод. И здесь
    > признак if Assigned(myObj) вполне себе удобен

    А мне не нравится сочетание слов "порой вполне по делу". Я в любом случае предпочту из этого сочетания оставить только два последних слова.
    Ну и не понимаю, что вы имеете в виду под "пересоздания объектов с временем жизни более, чем одна функция/метод".
  • KSergey © (30.10.18 08:33) [16]
    > Германн ©   (30.10.18 01:35) [15]
    > Ну и не понимаю, что вы имеете в виду под "пересоздания
    > объектов с временем жизни более, чем одна функция/метод".


    unit appsettings;

    interface
     function GetSettings(): TApplicationSettings;
     procedure ReloadSettings();

    implementation

    var
      settings: TApplicationSettings = nil;

    function GetSettings(): TApplicationSettings;
    begin
     if NOT Assigned(settings) then
       begin
         LoadSettings(settings);
       end;
     Result := settings;
    end;

    procedure ReloadSettings();
    begin
     FreeAndNil(settings);
    end;
  • Германн © (31.10.18 01:44) [17]

    > KSergey ©   (30.10.18 08:33) [16]

    А чем не подходит:
    unit appsettings;

    interface
    function GetSettings(): TApplicationSettings;

    implementation

    var
     Settings: TApplicationSettings;

    function GetSettings(): TApplicationSettings;
    begin
    if assigned(Settings) then Settings.Free;
    LoadSettings(Settings);
    Result := Settings;
    end;

  • asail © (31.10.18 03:49) [18]

    > А чем не подходит:

    Наверное тем, что при каждом обращении объект будет уничтожаться и создаваться заново, вместо того, чтобы создаться один раз. А таких обращений может быть мульен, да и время зачитывания (LoadSettings) может тоже быть очень далеким от нулевого.
  • Германн © (01.11.18 02:25) [19]

    > asail ©   (31.10.18 03:49) [18]
    >
    >
    > > А чем не подходит:
    >
    > Наверное тем, что при каждом обращении объект будет уничтожаться
    > и создаваться заново

    С какого перепуга?
  • asail © (01.11.18 02:33) [20]

    > Германн ©   (01.11.18 02:25) [19]
    > С какого перепуга?

    Не с перепуга, а согласно кода. Смотрим:
    При каждом, кроме первого, обращения к GetSettings будет вызываться Free, ибо он assigned. Так? Значит объект уничтожается.
    И тут же, опять таки, при каждом обращении, вызывается LoadSettings, в которой объект инициализируется заново. Так? Вот и получается, что таки при каждом...
  • Германн © (01.11.18 03:05) [21]
    Я был не прав. Посыпаю голову...
  • ухты © (01.11.18 10:26) [22]
    давно пора встроить какой "пылесос" и не заниматься холиворами, 21 век а тут все еще фри..ки разные))
  • KSergey © (01.11.18 10:43) [23]
    пылесосы встроены уже давно.
    только радости в итоге нет
  • ухты © (01.11.18 11:10) [24]
    А какая радость ожидается? меньше думаешь про ерунду, разве не здорово? ))
Есть новые Нет новых   [118241   +25][b:0][p:0.001]