Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

FreeAndNill


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

Приветствую!

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

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]

А какая радость ожидается? меньше думаешь про ерунду, разве не здорово? ))


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо