私は実際にこれまで聞いたことがありませんFreeOnRelease
。グーグルですばやく検索すると、その理由がわかりました。 公式ドキュメントから:
FreeOnReleaseは、コンポーネントによって実装されたインターフェースが解放されたときに呼び出されます。FreeOnReleaseは内部で使用され、対応するインターフェイスメソッドを呼び出します。FreeOnReleaseを直接呼び出す必要はありません。
Free
対に関してはDestroy
、Free
は安全機能です。基本的にはとして実装されif self <> nil then self.Destroy;
、コンストラクタとデストラクタを安全に使用できるようにするために作成されました。基本的な考え方は次のとおりです。
オブジェクトを作成しているときに未処理の例外が発生した場合、デストラクタが呼び出されます。オブジェクトに他のオブジェクトが含まれている場合、エラーが発生するまでにオブジェクトがまだ作成されている場合とされていない場合があるためDestroy
、すべてのオブジェクトを呼び出すことはできません。ただし、作成されたものが確実に破棄されるようにする方法が必要です。
Delphiはコンストラクターを呼び出す前にオブジェクトのアドレス空間をゼロにするため、まだ作成されていないものはすべて、この時点でゼロであることが保証されます。したがって、すべてのサブオブジェクトについて何度も何度も言うことができますif FSubObject <> nil then FSubObject.Destroy
(そして、アクセス違反が発生することを忘れた場合)、またはFree
メソッドを使用することができます。(これは、コンストラクターが呼び出される前にメモリスペースがゼロにされないC ++に比べて大幅に改善されています。これには、すべてのサブオブジェクトをスマートポインターでラップし、RAIIを使用して例外安全性を維持する必要があります!)
他の場所でも便利で、使わない理由はありません。これが測定可能なパフォーマンスの低下をもたらすことに気づいたことはなくFree
、コードの安全性が向上するため、すべての場合に使用することをお勧めします。
そうは言っても、フォームを具体的に扱う場合、方程式に組み込む追加の変数があります。それはWindowsメッセージキューです。解放しようとしているフォームの保留中のメッセージがまだあるかどうかわからないため、フォームを呼び出すことが常に安全であるとは限りませんFree
。そのためのRelease
方法があります。キューにメッセージを投稿し、処理するメッセージがなくなるとフォームが自動的に解放されるため、通常は、不要になったフォームを解放するための最良の方法です。