アプリで使用されている割り当て済みのメモリを削除したい。使用する必要があることはわかっていますが、とrelease
の違いは何ですか?彼らは同じですか?free()
release
2 に答える
free()
はC標準ライブラリの一部であるため、関数です。を使用して取得した割り当て済みメモリをすぐに解放するmalloc()
ため、によって割り当てられたポインタを渡す必要があります。そうしないと、malloc()
未定義の動作が発生します。
- release
クラスの(関数ではなく)メソッドです。NSObject
すぐにメモリを解放するわけではありません。オブジェクトの参照カウントを1つ減らすだけです。次に、0であることも確認します。ゼロの場合は、呼び出します- dealloc
(通常、コンストラクターメソッドによって割り当てられたメモリ- init
またはによって割り当てられたメモリを解放するためにサブクラスによってオーバーライドされます)。free()
malloc()
したがって、それらはまったく同じではありません。それらを交換して使用しようとさえしないでください。
より興味深い部分は、無料がどのように機能するかです:(そしてこの方向では、mallocもよりよく理解できます)
多くのmalloc/free実装では、freeは通常、メモリをオペレーティングシステムに返しません(または少なくともまれなケースでのみ)。その理由は、ヒープにギャップが生じるため、ギャップのある2GBまたは4GBの仮想メモリを終了するだけで発生する可能性があるためです。もちろん、これは避ける必要があります。仮想メモリが終了するとすぐに、非常に大きな問題が発生するからです。もちろん、他の理由は、OSが特定のサイズと配置のメモリチャンクしか処理できないことです。具体的には、通常、OSは仮想メモリマネージャーが処理できるブロックのみを処理できます(ほとんどの場合、512バイトの倍数(例:4KB))。
したがって、40バイトをOSに返すことは機能しません。では、無料は何をするのでしょうか?
Freeは、メモリブロックを独自の空きブロックリストに入れます。通常、アドレス空間内の隣接するブロックをマージしようとします。フリーブロックリストは、メモリチャンクの循環リストであり、もちろん最初にいくつかの管理データがあります。これは、標準のmalloc/freeを使用して非常に小さなメモリ要素を管理することが効率的でない理由でもあります。すべてのメモリチャンクには追加のデータが必要であり、サイズが小さいほど断片化が発生します。
フリーリストは最初の場所でもあり、mallocは必要に応じて新しいメモリチャンクを探します。OSから新しいメモリを呼び出す前にスキャンされます。必要なメモリよりも大きいチャンクが見つかった場合、それは2つの部分に分割されます。1つは発信者に返され、もう1つはフリーリストに戻されます。
リリース:Cocoaは特定の命名規則を使用しています。alloc、new、またはcopyで始まるものはすべて、retainCountが1の何かを返し、リリースする必要があります。リリースが呼び出されると、reatinCountは1ずつ減少します。