Я никогда не слышал о FreeOnRelease
раньше. Быстрый поиск в Google обнаружил причину. Из официальной документации:
FreeOnRelease вызывается, когда
интерфейс реализован компонентом
выпущен. FreeOnRelease используется
внутренне и вызывает соответствующий
интерфейсный метод. Так не должно быть
необходимо позвонить в FreeOnRelease
непосредственно.
Что касается Free
против Destroy
, Free
- это функция безопасности. Он в основном реализован как if self <> nil then self.Destroy;
и создан для безопасности использования конструкторов и деструкторов. Вот основная идея:
Если вы создаете объект и возникает необработанное исключение, вызывается деструктор. Если ваш объект содержит другие объекты, они могут или не могли быть созданы к моменту возникновения ошибки, поэтому вы не можете просто попытаться вызвать Destroy
для всех из них. Но вам нужен способ убедиться, что созданные были уничтожены.
Поскольку Delphi обнуляет адресное пространство объекта перед вызовом конструктора, все, что еще не было создано, гарантированно будет nil на этом этапе. Таким образом, вы могли бы говорить if FSubObject <> nil then FSubObject.Destroy
снова и снова для всех подобъектов (и если вы забудете, что вы получите нарушения доступа), или вы можете использовать метод Free
, который сделает это за вас. (Это огромное улучшение по сравнению с C ++, где пространство памяти не обнуляется до вызова конструктора, что требует от вас обернуть все ваши подобъекты в интеллектуальные указатели и использовать RAII для обеспечения безопасности исключений!)
Это полезно и в других местах, и на самом деле нет причин не использовать его. Я никогда не замечал, что Free
налагает какие-либо ощутимые потери производительности и повышает безопасность вашего кода, поэтому рекомендуется использовать его во всех случаях.
Сказав, что , когда речь идет конкретно о формах, есть еще одна переменная для учета в уравнении: очередь сообщений Windows. Вы не знаете, есть ли еще ожидающие сообщения для формы, которую вы собираетесь освободить, поэтому не всегда безопасно вызывать Free
в форме. Для этого есть метод Release
. Он отправляет сообщение в очередь, в результате чего форма освобождается, когда у нее больше нет сообщений для обработки, поэтому, как правило, это лучший способ освободить форму, которая вам больше не нужна.