メモリ管理


メモリ管理は、オブジェクトのライフサイクルを管理し、それらがもはや不要になったときにそれらを解放する、プログラミング分野です。オブジェクトメモリの管理は、パフォーマンスの問題です。アプリが、不要なオブジェクトを自由にしなければ、そのメモリの足跡は大きくなり、パフォーマンスが低下します。ガベージコレクションを使用していない Cocoa アプリでのメモリ管理は、参照カウンタのモデルに基づいています。オブジェクトを作成したり、コピーすると、その保持カウント(retain count) は1になります。その後、他のオブジェクトがあなたのオブジェクトを持ちたいと言う意欲を表明すると、その保持カウントを増分します。また、オブジェクトの所有者は、その所有欲を放棄すると、保持カウントを減少させます。保持カウントがゼロになったときは、オブジェクトは割り当てが解除され(破壊され)ます。


メモリ管理を支援するため、Objective-C は、一連のルールに準拠して使用しなければならないメソッドと仕組みを提供します。


注意:OS X では、明示的にメモリを管理したり、Objective-C のガベージコレクション機能を使用できます。iOS では、ガベージコレクションを利用できません。



memory_management_2x


メモリ管理の規則


時には 所有ポリシー と呼ばれるメモリ管理の規則は、明示的に Objective-C のコードでメモリを管理するのに役立ちます。


  • メモリを割り当てて作成するか、それをコピーして、オブジェクトを何でも所有します。
  • 関連するメソッド:allocallocWithZone:copycopyWithZone:mutableCopymutableCopyWithZone:


  • オブジェクトの作成者でないが、使用するためにメモリに常駐しているのを確認したい場合は、所有権の対象とすることができます。
  • 関連するメソッド:retain


  • オブジェクトを所有している場合、それを作成したり、所有権を発現させることにより、もはやそれを必要としないときは、それを解放する責任があります。
  • 関連するメソッド:releaseautorelease


  • 逆に、オブジェクトの作成者ではなく、所有権を表明していない場合は、あなたはそれを解放(release)しては いけません

  • プログラム内の他の場所からどこでもオブジェクトを受け取った場合、受け取った所ではメソッド内あるいは関数内で有効なままと保障されます。それがその範囲を超えて有効なままにしたい場合は、それを保持するか、コピーする必要があります。既に割り当てが解除されているオブジェクトを解放しようとすると、プログラムはクラッシュします。


    メモリ管理の側面


    以下の概念を理解する事は、適切にオブジェクトメモリの管理をするのに欠かせません。


  • 自動解放プール 。オブジェクトに autorelease (自動解放) を送信すると、リリースされたオブジェクトが、現在の範囲を超えて存続したい場合に便利であり、後にリリースするためのオブジェクトをマークします。オブジェクトを自動解放すると、任意のプログラムの範囲用に作成された自動解放プール(NSAutoreleasePool のインスタンス) に入れます。プログラムの実行がその範囲を出ると、プール内のオブジェクトは解放されます。
  • 割り当て解除。オブジェクトの保持カウントがゼロになると、実行環境は、オブジェクトを破棄する直前に、オブジェクトクラスの dealloc メソッドを呼び出します。クラスは、そのインスタンス変数によって指されるオブジェクトを含むオブジェクトが保持しているすべてのリソースを、解放するために、このメソッドを実装しています。
  • ファクトリメソッド。多くのフレームワーククラスは、利便性のために、クラスオブジェクトを作成し、クラスメソッドを定義します。これら、返されたオブジェクトは、受信するメソッドの範囲を超えて有効であるとは限りません。


  • 前提条件の記事

    オブジェクト作成

    オブジェクトのコピー


    関連記事

    オブジェクトのライフサイクル


    既出の議論

    高度なメモリ管理プログラミングガイド






    次の章
    前の章
    目次
    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