オブジェクトの所有権
Objective-C は、オブジェクトの所有権の概念によってそのオブジェクトのメモリを管理するために、参照カウントを使用します。(デフォルトで有効な) ARC 機能を使用してコードをコンパイルすると、コンパイラは、作成した参照を取り、根本的なメモリ管理機構への呼び出しを自動的に挿入します。オブジェクトへの 参照(reference) は、オブジェクトに到達することができる任意のオブジェクトポインタまたはプロパティです。
オブジェクト参照には2つの型があります。
- メモリにオブジェクトを"生きている" まま保つ強い参照。
- 参照されたオブジェクトの寿命に影響を及ぼさない弱い参照。
あなたのコードのほとんどの参照は強い参照で、形式を使ってオブジェクト参照を宣言するときのデフォルトの動作です:
強い参照 は、参照されたオブジェクトがメモリに残り(つまり、それが割り当て解除されていない)、参照が有効である間残ることを保証します。オブジェクトへの残りの強い参照がない場合、オブジェクトの割り当てが解除されます。
強い参照は常に正しい選択ではありません。例えば、2つのオブジェクトが、相互に参照する必要がある場合、両方の参照を強力にすると、両方のオブジェクトを決して割り当てが解除されなくし、強い循環参照 を作成します。これらのケースでは、弱い参照 を使用して下さい。
弱い参照は、それが参照するオブジェクトのライフサイクルに影響を与えません。オブジェクトへの強い参照が残っていないとき、まだ弱い参照がある場合でも、オブジェクトは割り当て解除され、またオブジェクトへの弱い参照は nil に設定されています。この nil 動作のため、弱い参照は時々 zeroing 弱い参照と呼ばれます。
弱い参照を作成するには、__weak 修飾子を使用して以下のようにします:
参照が、強いか、弱いかを決定するのは、それが所有権、依存性、または封じ込めを表現しているかどうかを考えて下さい。例えば、それが彼らの所有権を持っていて、スーパービューは、そのサブビューへの強い参照を保持しています。それが彼らの継続的な存在に依存するため、アプリのデリゲートは、そのデータモデル、コントローラ、ビューに強い参照を維持します。配列は、それが含むオブジェクトへの強い参照を維持します。しかし、参照は利便性の一つであるため、サブビューは、親ビューへの弱い参照を維持します。いくつかの状況で、親ビューを持っていない可能性さえもあります。同様に、データを提示するビューは、そのデリゲートとデータソースへの弱い参照を維持します。ビューは、一般的にデリゲートとデータソースとして機能する他のオブジェクト、通常はビューコントローラによって所有されています。
実際には、メモリ内のすべてのオブジェクトは、アプリ自体で始まり、それが維持する強い参照を介して下がり続ける階層を形成します。アプリはトップレベルの MVC オブジェクトへの強い参照を保持し、そのアプリのデリゲートへの強い参照を保持しており、それらは、個々のタスクを実行する必要のあるオブジェクトへの強い参照を保持します。下位レベルのオブジェクトが、メモリ・ツリーの高いオブジェクトに参照する場合、それらは弱い参照を使用します。これらの下位レベルのオブジェクトは、より高いレベルのオブジェクトを所有しておらず、そしてそれらに強い参照を保持することは、強力な循環参照を作成します。
前提条件の記事
(なし)
関連記事
(なし)
既出の議論
所有権と責任を介してオブジェクトグラフの管理
次の章
前の章