オブジェクトの所有権


Objective-C は、オブジェクトの所有権の概念によってそのオブジェクトのメモリを管理するために、参照カウントを使用します。(デフォルトで有効な) ARC 機能を使用してコードをコンパイルすると、コンパイラは、作成した参照を取り、根本的なメモリ管理機構への呼び出しを自動的に挿入します。オブジェクトへの 参照(reference) は、オブジェクトに到達することができる任意のオブジェクトポインタまたはプロパティです。


オブジェクト参照には2つの型があります。


あなたのコードのほとんどの参照は強い参照で、形式を使ってオブジェクト参照を宣言するときのデフォルトの動作です:


NSString *someReferenceToAString;


強い参照 は、参照されたオブジェクトがメモリに残り(つまり、それが割り当て解除されていない)、参照が有効である間残ることを保証します。オブジェクトへの残りの強い参照がない場合、オブジェクトの割り当てが解除されます。


強い参照は常に正しい選択ではありません。例えば、2つのオブジェクトが、相互に参照する必要がある場合、両方の参照を強力にすると、両方のオブジェクトを決して割り当てが解除されなくし、強い循環参照 を作成します。これらのケースでは、弱い参照 を使用して下さい。


弱い参照は、それが参照するオブジェクトのライフサイクルに影響を与えません。オブジェクトへの強い参照が残っていないとき、まだ弱い参照がある場合でも、オブジェクトは割り当て解除され、またオブジェクトへの弱い参照は nil に設定されています。この nil 動作のため、弱い参照は時々 zeroing 弱い参照と呼ばれます。


弱い参照を作成するには、__weak 修飾子を使用して以下のようにします:


NSString * __weak someWeakReferenceToAString;


参照が、強いか、弱いかを決定するのは、それが所有権、依存性、または封じ込めを表現しているかどうかを考えて下さい。例えば、それが彼らの所有権を持っていて、スーパービューは、そのサブビューへの強い参照を保持しています。それが彼らの継続的な存在に依存するため、アプリのデリゲートは、そのデータモデル、コントローラ、ビューに強い参照を維持します。配列は、それが含むオブジェクトへの強い参照を維持します。しかし、参照は利便性の一つであるため、サブビューは、親ビューへの弱い参照を維持します。いくつかの状況で、親ビューを持っていない可能性さえもあります。同様に、データを提示するビューは、そのデリゲートとデータソースへの弱い参照を維持します。ビューは、一般的にデリゲートとデータソースとして機能する他のオブジェクト、通常はビューコントローラによって所有されています。


strongAndWeak_2x


実際には、メモリ内のすべてのオブジェクトは、アプリ自体で始まり、それが維持する強い参照を介して下がり続ける階層を形成します。アプリはトップレベルの MVC オブジェクトへの強い参照を保持し、そのアプリのデリゲートへの強い参照を保持しており、それらは、個々のタスクを実行する必要のあるオブジェクトへの強い参照を保持します。下位レベルのオブジェクトが、メモリ・ツリーの高いオブジェクトに参照する場合、それらは弱い参照を使用します。これらの下位レベルのオブジェクトは、より高いレベルのオブジェクトを所有しておらず、そしてそれらに強い参照を保持することは、強力な循環参照を作成します。


前提条件の記事

(なし)


関連記事

(なし)


既出の議論

所有権と責任を介してオブジェクトグラフの管理






次の章
前の章
目次
Xcode の新機能

インターフェースビルダー ヘルプ
NSObject(class)
概要(NSObject,class)

  • アクセシビリティ
  • VoiceOver での作業
  • アクセサメソッド
  • 命名規則
  • アプリ ID
  • 明示的なアプリ ID は、一つのアプリに一致
    ワイルドカードアプリ ID は複数のアプリに一致
    アプリコード署名
  • ブロックオブジェクト
  • ブロックの宣言
    ブロックの作成
    変更可能なブロックの変数
    ブロックを使用する
    比較演算
  • バンドル
  • バンドルの構造と内容 バンドルリソースへのアクセス
    ロード可能なバンドル
  • カテゴリ
  • 宣言
    実装
  • クラスクラスタ
  • 利点
    検討事項
  • クラスの定義
  • インターフェース
    実装(Implementation)
  • クラスメソッド
  • サブクラス
    インスタンス変数
    self
  • ココア(タッチ)、Cocoa(Touch)
  • フレームワーク(Framework)
    言語
    コーディング規則
  • コレクション(Collection)
  • コレクションクラス
    順序付けスキーム
  • コントローラーオブジェクト
  • コントローラの調整
    ビューコントローラ
    仲介コントローラ(OS X)
    宣言されたプロパティ
  • デリゲート(Delegate)
  • デリゲートとココアフレームワーク
    デリゲートと通知
    データソース
    動的バインディング
  • 動的型付け
  • isa ポインタ
  • 列挙
  • NSEnumerator
    高速列挙
  • 例外処理
  • 例外の種類
    コンパイラディレクティブを使用した例外処理
    信号伝達のエラー
    フレームワーク
    情報プロパティリスト
  • 初期化
  • イニシャライザ宣言の型
    初期化子を実装
    国際化
  • 内観(イントロスペクション)
  • イントロスペクション情報の種類
  • キー値コーディング
  • オブジェクトのプロパティと KVC
    クラスを KVC に準拠させる
  • キー値監視
  • KVO の実装
    KVO はバインディングの不可欠な部分(OS X)
  • メモリ管理
  • メモリ管理の規則
    メモリ管理の側面
    メッセージ
    メソッドのオーバーライド
  • モデルオブジェクト
  • うまく設計されたモデルクラス
  • モデル・ビュー・コントローラ
  • モデルオブジェクト
    ビュー・オブジェクト
    コントローラオブジェクト
  • 複数のイニシャライザ
  • 指定イニシャライザ
    Nib ファイル
  • 通知
  • 通知オブジェクト
    通知を観察する
    通知を投稿
  • アーカイブ
  • 鍵付き連続アーカイバ
    鍵付きアーカイブの作成とデコード
  • オブジェクトの比較
  • 比較ロジックを実装する
  • オブジェクトのコピー
  • オブジェクトコピーのための要件
    メモリ管理への影響
  • オブジェクト作成
  • オブジェクト作成式の形式
    メモリ管理への影響
    ファクトリメソッド
  • オブジェクトの暗号化
  • オブジェクトの暗号化と復号化する方法
    キー付き対連続的アーカイブ
    オブジェクトグラフ
    オブジェクトのライフサイクル
    オブジェクトモデリング
  • オブジェクト可変性(mutability)
  • 可変オブジェクトを受け取る
    可変オブジェクトを格納
    オブジェクトの所有権
    Objective-C
  • プロパティ(特性)リスト
  • プロパティリストの型とオブジェクト
    プロパティリストのベストプラクティス
    プロパティリストのシリアライズ
  • プロトコル
  • 公式、非公式なプロトコル
    正式なプロトコルを採用、準拠
    独自のプロトコルを作成
    ルートクラス
  • セレクタ
  • セレクタの取得
    セレクタの使用
    シングルトン
  • 統一された型の ID
  • UTI は逆ドメイン·ネーム·システム規則を使用
    統一された型 ID は適合階層で宣言
    OS X のアプリは、アプリバンドルでそれらを定義して新しい UTIを追加
  • 値オブジェクト
  • NSValue