Cocoaのメモリ管理関する3つのルール

in

Obujective-C 2.0の時代にアレなんですが、オブジェクトのretain/releaseに関しては時々混乱することがあるので「Learn Objective-C on the Mac」に載っていたCocoaのメモリ管理関する3つのルールをメモ。メカニズムを正しく理解するのも大切だけれど実際コードを書くときにスッっとでてくるガイドラインも大切ということで...

  1. オブジェクトをnew、alloc、copyで生成した場合、release/autoreleseメッセージを送信してオブジェクト解放の責任を負う。
  2. new、alloc、copy以外の方法でオブジェクトを取得した場合オブジェクトはautorelese対象であり、オブジェクト解放のために特になにかする必要はない。(ただし、ルール3には従う必要がある)
  3. もし、オブジェクトにretainメッセージを送信した場合、このretainに対応するrelese/autoreleseメッセージを送信する責任がある。

単純でわかりやすい。普段は1.を気をつけていればいいってことになります。僕が迷うのはアクセッサメソッドの実装で、オブジェクトの生成が離れた箇所に実装されているので迷います。本書にも載っていた、

setSomething:(id)someObject
{
  [someObject retain];
  [myObject release];
  myObject = someObject;
}

とするパタンと、

setSomething:(id)someObject
{
  [myObject release];
  myObject = [someObject copy];
}

のパタンで「アレ? retainするんだっけ?」みたいなヘモい混乱。上の例ならルール3、下の例ならルール1で(たぶん)もう迷わない(と思う)。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/313

返信