メモリ管理について
アプリケーションメモリ管理は、プログラムの実行中にメモリを割り当て、使用してメモリを解放し、メモリを使用し終われば解放する過程です。よく書かれたプログラムは、できるだけ少ないメモリを使用します。Objective-C では、限られたメモリリソースの所有権を多くのデータとコードに分散する方法としても見られます。このガイドの作業が終了したら、オブジェクトの寿命を明示的に管理し、不要になったらオブジェクトを解放することによって、アプリケーションのメモリを管理するために必要な知識を身に付けることができます。
メモリ管理は通常、個々のオブジェクトのレベルで考慮されますが、目標は実際に オブジェクトグラフ を管理することです。実際に必要なものよりも多くのオブジェクトがメモリにないことを確認したいとします。
一目見て
Objective-C は、アプリケーションメモリ管理用に 2 つの方法を提供します。
- このガイドで説明されている方法 ("マニュアルで保持解除" または MRR) では、所有するオブジェクトを追跡して明示的にメモリを管理します。これは、Foundation クラスの NSObject が実行時環境とともに提供する参照カウントと呼ばれるモデルを使用して実装されます。
- Automatic Reference Counting (ARC) では、システムは MRR と同じ参照計数システムを使用しますが、コンパイル時に適切なメモリ管理メソッド呼び出しを挿入します。新しいプロジェクトには ARC を使用することを強くお勧めします。ARC を使用する場合、通常、この文書で説明されている基本的な実装を理解する必要はありませんが、状況によっては役立つ場合もあります。ARC の詳細については、ARC リリース移行へのノート を参照してください。
メモリー関連の問題を防ぐ良い方法
間違ったメモリ管理の結果、主な 2 つの種類の問題が発生します。
- まだ使用されているデータの解放または上書き
これによりメモリが破壊され、通常、アプリケーションがクラッシュしたり、悪化したりして、ユーザーデータを破損します。 - 使用されなくなったデータを解放しないとメモリリークが発生します
メモリリークは、割り当てられたメモリが再び使用されなくても解放されないと起きます。リークにより、アプリケーションのメモリ使用量が非常に増加し、システムのパフォーマンスが低下したり、アプリケーションが終了したりする可能性があります。
しかし、実際の目標ではなく実装の詳細に関してメモリ管理を検討する傾向があるため、参照カウントの観点からメモリ管理について考えることはしばしば非生産的です。代わりに、オブジェクトの所有権と オブジェクトグラフ の観点からメモリ管理を考える必要があります。
メソッドが返すオブジェクトの所有者を示すために、Cocoa は簡単な命名規則を使用します。
メモリ管理ポリシー を参照の事。
基本方針は簡単ですが、メモリの管理を容易にし、プログラムの信頼性と堅牢性を維持しつつ、リソース要件を最小限に抑えるための実践的な手順があります。
実践的なメモリ管理 を参照の事。
自動解放プールブロックは、オブジェクトに "遅延" release メッセージを送信できるメカニズムを提供します。これは、オブジェクトの所有権を放棄したいが、すぐに解放される可能性を避けたい場合 (メソッドからオブジェクトを返すときなど) に便利です。独自の自動解放プールブロックを使用する場合があります。
分析ツールを使用してメモリの問題をデバッグ
コンパイル時にコードの問題を特定するには、Xcode に組み込まれている Clang Static Analyzer を使用します。
それにもかかわらず、メモリ管理の問題が発生した場合は、問題を特定して診断するために使用できる他のツールとテクニックがあります。
- ツールやテクニックの多くは Technical Note TN2239、iOS デバッグマジック、特に解放され過ぎたオブジェクトを見つけるための NSZombie の使用で説明されています。
- インストルメントを使用して参照カウントイベントを追跡し、メモリリークを探すことができます。アプリでのデータの収集 を参照してください。
次の章