※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

Tags:

トップ > ガイド > パフォーマンス > Cocoaのメモリ管理プログラミングガイド > オブジェクトの所有権と廃棄


オブジェクトの所有権と廃棄 翻訳元


このページの最終更新: 2010-02-03
ADCの最終更新:2009-10-21


オブジェクトの所有権についての方針(Object Ownership Policy)


 Objective-Cプログラムでは、オブジェクトは絶え間なく生成され、廃棄されています。アプリケーションが必要以上にメモリを使わないことを確実にする為に、オブジェクトがそれ以上必要なくなった時に廃棄するのは重要なことです。オブジェクトはいつでも、専用のオブジェクトを生成し、必要な時に廃棄することができます。しかし、オブジェクトが他のオブジェクトにメッセージを送り、値を渡したとき、所有権の方針と、廃棄の義務が曖昧になってしまいます。例えば、たくさんのSprocketオブジェクトを持つThingamjigオブジェクトがあるとします。他のオブジェクトは、このオブジェクトに次のメソッドを使ってアクセスします。
- (NSArray *)sprockets
 この宣言は誰も戻り値の配列を廃棄すべきでない、ということを示しています。しかし、Thingamajigオブジェクトがインスタンス変数を返すなら、その配列に対する責任がある、と考えるのは当然です。一方で、新しいThingamajigオブジェクトを生成した場合、その生成したオブジェクトを廃棄する責任が生じます。この説明の仕方は混乱のもとになります。「廃棄する」というのは一般に「捨てる」または「解放する」と言うのを意味します。
 あるオブジェクトがオブジェクトを生成し、他のオブジェクトに渡すことは可能(実際には一般的)です。新しいオブジェクトは第三者が使い終わるまで捨てられないことが重要です。したがって、オブジェクトの所有権という観点からメモリ管理を考えるなら、どんなオブジェクトも一つ以上の所有者を持つことができる方が良いでしょう。オブジェクトは、最低一つのオブジェクトに所有されている限りは、存在し続けます。オブジェクトが誰にも所有されなくなったら、そのオブジェクトはランタイムが自動的に廃棄(解放)します。
 いつオブジェクトを所有していつしないか、所有者として何の責任があるかを明確にする為に、Cocoaでは以下の方針を決めています。
  • 生成したオブジェクトには所有権があります。
    オブジェクトは名前が「alloc」か「new」で始まるメソッドか、「copy」を名前に含むメソッド(例えばalloc, newObject, mutableCopy等)を使って「生成」します。
    他にもオブジェクトの所有権を得る方法があります。「Taking Ownership of Objects」で解説します。
  • オブジェクトを所有しているのなら、使い終えた時に所有権を放棄する責任があります。
    所有権はオブジェクトにreleaseメッセージかautoreleaseメッセージ(autoreleaseは「Delayed Release」で詳しく解説します)を送ることによって放棄します。Cocoaの命名規則では、所有権の放棄は一般的にオブジェクトをリリースすることを指します。
  • 当然、所有していないオブジェクトの所有権を廃棄してはいけません。
 この方針はGUIベースのCocoaアプリケーションとコマンドラインFoundationツールの両方に適用されます。
 以下の例を考えてください。
Thingamajig *myThingamajig = [[Thingamajig alloc] init];
// ...
NSArray *sprockets = [myThingamajig sprockets];
// ...
[myThingamajig release];
 この例は、この方針を適切に守っています。allocメソッドを使ってThingamajigオブジェクトを生成しているので、その後releaseメッセージをオブジェクトに送っています。sproketオブジェクトの配列をThingamajigオブジェクトから得たときは、配列を「生成した」訳ではないので、releaseメッセージは送りません。

所有権の獲得(Taking Ownership of Objects)



オブジェクトの解放(Deallocating an Object)



リソース管理(Resource Management)




|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|