Brovin Yaroslav

[Статья] Жизненный цикл объектов в Delphi. Часть 1. Windows, OSX. Что же использовать Destroy, Free, FreeAndNil или DisposeOf?

18 сообщений в этой теме

С появлением мобильных платформ в мире Delphi, произошли серьезные изменения в жизненном цикле объектов. Послужившие причиной многих проблем и вопросов, а как правильно кроссплатформенно удалять объекты. В этой статье детально рассматриваем жизненный цикл объектов на разных платформах и даём ответы на важные вопросы, которые могут побеспокоить даже опытных Delphi разработчиков.

sinuke, Кирилл, Mars M и 16 другим понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

замечательная статья. и очень полезная, расставляющая все точки над i. спасибо. ждем продолжения для мобильных платформ )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Очень просто и доходчиво! Методичку писать можно! )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо Ярослав за статью. Вы ответили на мой не заданный вопрос: как правильно в кросс-платформенной среде создавать и уничтожать экземпляры объектов, сохраняя единство кода для всех платформ.
У меня предложение - может быть выделить отдельную тему для подобных статей или вопросов назвав ее - правила хорошего кода. Ибо считаю важным для программиста выработку навыка корректного использования тех или иных методов, особенно тем, кто только начинает с пониманием почему нужно так.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 минуты назад, mixi сказал:

Спасибо Ярослав за статью. Вы ответили на мой не заданный вопрос: как правильно в кросс-платформенной среде создавать и уничтожать экземпляры объектов, сохраняя единство кода для всех платформ.
У меня предложение - может быть выделить отдельную тему для подобных статей или вопросов назвав ее - правила хорошего кода. Ибо считаю важным для программиста выработку навыка корректного использования тех или иных методов, особенно тем, кто только начинает с пониманием почему нужно так.

 

тут еще не совсем кроссплатформа, а только Вин и МакОС. мобильные платформы в следующей части и там есть нюансы

Kitty, Andrey Efimov и Равиль Зарипов (ZuBy) понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо , большое за статью 。 Хотелось бы только уточнить,  правильно ли я понимаю, что  для многоплатформенных решении FreeAndNil не совсем правильная практика,  при разрушении объектов в на каких-то платформах  FreeAndNil просто обнуляет ссылки。 И для правильной работы автоматической системы подсчета ссылок  и гарантированного разрушения объекта лучше  использовать  DisposeOf  .Думаю это будет во второй части  но хотелось бы уточнить  чтобы меньше было правок в написанном коде :)

 

Изменено пользователем CodeToad

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, CodeToad сказал:

Спасибо , большое за статью 。 Хотелось бы только уточнить,  правильно ли я понимаю, что  для многоплатформенных решении FreeAndNil не совсем правильная практика,  при разрушении объектов в на каких-то платформах  FreeAndNil просто обнуляет ссылки。 И для правильной работы автоматической системы подсчета ссылок  и гарантированного разрушения объекта лучше  использовать  DisposeOf  .Думаю это будет во второй части  но хотелось бы уточнить  чтобы меньше было правок в написанном коде :)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
54 минуты назад, Равиль Зарипов (ZuBy) сказал:

 

Что значит в зависимости от типа c?

c[r] := nil; // Или FreeAndNil(c[r]), в зависимости от типа c.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
47 минут назад, GASCHE сказал:

Что значит в зависимости от типа c?

Если c - это объект и у него определен дефолтное свойство, то его нельзя передавать, как var параметр. Компилятор не соберет такой код.

Равиль Зарипов (ZuBy) понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо Ярослав!

Есть еще одна статья от GunSmoker на эту тему. Там есть ряд интересных ньюансов, которые не описаны у Ярослава и о которых многие не знают.

К примеру то, что DisposeOf хотя и вызывает деструктор, но не освобождает память выделенную под объект.. 

 

Изменено пользователем ENRGY
Rusland понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за статью!

А под Android-ом как лучше удалять временно создаваемые фреймы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
52 минуты назад, Major сказал:

Спасибо за статью!

А под Android-ом как лучше удалять временно создаваемые фреймы?

Например, вот так:

Создаём фрейм

  FFrmSettings := TfrmSettings.Create(Self);
  FFrmSettings.Parent := Parent;

Уничтожаем фрейм

  if FFrmSettings <> nil then
  begin
    FFrmSettings.Parent := nil;
    FFrmSettings.DisposeOf;
    FFrmSettings := nil;
  end;
Major, AlexG и Равиль Зарипов (ZuBy) понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 06.03.2017 в 00:29, ENRGY сказал:

К примеру то, что DisposeOf хотя и вызывает деструктор, но не освобождает память выделенную под объект.. 

Это часть из ARC. Поэтому в этой статье этот метод не рассматривается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А как быть с С++  - кругом в документации пишеться , что вместо Free необходимо использовать delete, но в андроиде delete не удаляет объект - тоже юзать FreeAndNil? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, antarey сказал:

А как быть с С++  - кругом в документации пишеться , что вместо Free необходимо использовать delete, но в андроиде delete не удаляет объект - тоже юзать FreeAndNil? 

в билдере есть умный указатель, unique_ptr, который сам чистит объекты которые больше никем не используются

Но это не точно

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
33 минуты назад, Равиль Зарипов (ZuBy) сказал:

в билдере есть умный указатель, unique_ptr, который сам чистит объекты которые больше никем не используются

Но это не точно

Вот как раз об unique_ptr тоже вопрос, как умные указатели ведут себя на мобильных платформах? Для винды написано что объекты уничтожаются когда их никто не использует, или же когда объект выходит за пределы видимости - если я правильно понял - если объект локальный и внутри какого-то обработчика, то объект будет уничтожен по завершению обработчика.
Но как сие на практике и для винды и мобильных платформ - вопрос к Ярославу и Ембарсадеро

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Цитата

Вот как раз об unique_ptr тоже вопрос, как умные указатели ведут себя на мобильных платформах?

Нормально ведет.
Начиная с 8:17 до 12:00 минуты видео:
*На слайде сказано: используйте unigue_ptr везде где возможно - Use unigue_ptr where possible.
*Не используйте new/delete

https://youtu.be/14w26ACHrII

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу