-
Приветствую! Как вы думаете, почему: procedure FreeAndNil(var Obj); а не procedure FreeAndNil(var Obj: TObject); ? PS Переводил старый код на интерфейсы, ну и влетел - компилятор проглотил FreeAndNill для интерфейса... со всеми вытекающими.
-
А ты попробуй объявить так, как ты написал и посмотри, что скажет компилятор.
-
> Тимохов Дима © (27.10.18 00:03)
Возможно в первую очередь стоит задуматься над тем, "А нафига вообще нужна процедура FreeAndNil"? Чем не устраивает метод Free?
-
Имхо, FreeAndNil придумали троешники для себя и себе подобных. Ибо она нужна для тех случаев, когда автор программы не может контролировать процесс создания и уничтожения объектов.
-
-
> vuk © (27.10.18 00:31) [1] > А ты попробуй объявить так, как ты написал и посмотри, что > скажет компилятор.
мудро, не подумал))) спасибо.
-
> 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, если что...
-
> asail © (28.10.18 20:03) [6] > А что не так с тем, что он написал? > Мне на такой вот код компилятор ничего не говорит:
Надо пробовать с переменными типа, отличного от TObject.
-
> Германн © (27.10.18 02:32) [2] > Возможно в первую очередь стоит задуматься над тем, "А нафига > вообще нужна процедура FreeAndNil"? Чем не устраивает метод Free?
Слюшай, э, зачем так катигарична, а?! порой вполне по делу. Бывают ведь пулы объектов, бывают просто пересоздания объектов с временем жизни более, чем одна функция/метод. И здесь признак if Assigned(myObj) вполне себе удобен
-
> vuk © (28.10.18 20:40) [7] > Надо пробовать с переменными типа, отличного от TObject.
Ничто не мешало сделать тут magic-костылёк в компиляторе как в некоторых других местах. Зато было бы избегнуто тьма проблем в мире. Но за пояснение - да, спасибо.
Помнится еще светлой памяти АП возмущался такой недоработке с параметром FreeAndNil
-
Free, FreeAndNull - они стоят такого количества разговоров вокруг себя?
-
> картман © (29.10.18 11:05) [10] > Free, FreeAndNull - они стоят такого количества разговоров вокруг себя?
Несколько странен ваш вопрос. Не мы выбираем что стоит, а что нет; но гугль позволяет получать статистику волнующих население вопросов.
-
> KSergey © (29.10.18 11:46) [11]
перефразирую вопрос: почему людей любят обсуждать шелуху? Конкретно эти две процедуры - ну не начхать ли на них? Они вообще никакого отношения к сложности реализации проектов не имеют - так стоят ли они затраченного на их обсуждение времени?
-
К сложности - не имеют. А вот к падучести - имеют самое прямое. А падучесть её сразу видно, во и приходится озабачиваться пока все эти моменты не разузнал и не стал всё это учитывать при "реализации сложных проектов".
-
> vuk © (28.10.18 20:40) [7] > Надо пробовать с переменными типа, отличного от TObject.
А, понял... Ступил.
-
> KSergey © (29.10.18 10:52) [8] > > > Германн © (27.10.18 02:32) [2] > > Возможно в первую очередь стоит задуматься над тем, "А > нафига > > вообще нужна процедура FreeAndNil"? Чем не устраивает > метод Free? > > Слюшай, э, зачем так катигарична, а?! порой вполне по делу. > > Бывают ведь пулы объектов, бывают просто пересоздания объектов > с временем жизни более, чем одна функция/метод. И здесь > признак if Assigned(myObj) вполне себе удобен
А мне не нравится сочетание слов "порой вполне по делу". Я в любом случае предпочту из этого сочетания оставить только два последних слова. Ну и не понимаю, что вы имеете в виду под "пересоздания объектов с временем жизни более, чем одна функция/метод".
-
> Германн © (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;
-
> 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;
-
> А чем не подходит:
Наверное тем, что при каждом обращении объект будет уничтожаться и создаваться заново, вместо того, чтобы создаться один раз. А таких обращений может быть мульен, да и время зачитывания (LoadSettings) может тоже быть очень далеким от нулевого.
-
> asail © (31.10.18 03:49) [18] > > > > А чем не подходит: > > Наверное тем, что при каждом обращении объект будет уничтожаться > и создаваться заново
С какого перепуга?
-
> Германн © (01.11.18 02:25) [19] > С какого перепуга?
Не с перепуга, а согласно кода. Смотрим: При каждом, кроме первого, обращения к GetSettings будет вызываться Free, ибо он assigned. Так? Значит объект уничтожается. И тут же, опять таки, при каждом обращении, вызывается LoadSettings, в которой объект инициализируется заново. Так? Вот и получается, что таки при каждом...
-
Я был не прав. Посыпаю голову...
-
давно пора встроить какой "пылесос" и не заниматься холиворами, 21 век а тут все еще фри..ки разные))
-
пылесосы встроены уже давно. только радости в итоге нет
-
А какая радость ожидается? меньше думаешь про ерунду, разве не здорово? ))
|