« iphone 開発 サンプル「CoreDataBooks」を読む。3 | トップページ | iphone用アプリ「乱語」サポートページ »

2010年7月 3日 (土)

retain autorelease ドット演算子

iPhoneアプリ用のソースをかくときに、
retainCountの動きを理解するのが難しい。

よくわからなかったのが、

@property (retain) NSMutableArray *array
というプロパティがあったときに、
self.array = [NSMutableArray array];

array = [NSMutableArray array];
では、retainCountに違いが出ること。

selfの方は2で、selfじゃない方は1になる。

これは、たぶんドット演算子でアクセスする場合、
retainの指示があるプロパティとしてアクセスするから、
生成+プロパティアクセスで2になる。

ためしに、
@property (assign) NSMutableArray *array
としたら、self.arrayの方もretainCounterは1になった。

また、[NSMutablerArray array]で生成されるオブジェクトは、
[[NSMutableArray alloc] init] autorelease]と同義。

ただ、ドキュメントを見ても、
生成メソッドがautoreleaseして返すか否かはかいてないみたい。

initXXX以外はautorelease付きと思えばよい?
→訂正)alloc,copy,newという語以外がautorelease付きの模様

まとめると、プロパティに何かを保存するときは、
・どのように生成するか(autoreleaseか否か)
・どのように保存するか(ドット演算子か否か)
・(ドット演算子を利用する場合)属性はretain/assign/copyのいずれか
を考える必要がある。

プロパティにイベントループをまたがる情報を持つ場合
・autoreleaseを利用しない
・ドット演算子を利用しない
ことによって、生成後のretainCountが1になるようにして、
deallocでreleaseするのが良い気がする。

どうでしょう。

追記)retainCountは、あくまでデバッグ用の参考で、重要なのは、自分が増やしたカウントは
責任を持って減らすこと。(まずは増やしているかいないかを知ること)

他人の作ったソースで、retainCountがいくつ増えるかはわからない。
(1だと思ってたら3とか4とかになってかえってくることも)

下は英語だけど日本語もどこかにあるはず。
http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

|

« iphone 開発 サンプル「CoreDataBooks」を読む。3 | トップページ | iphone用アプリ「乱語」サポートページ »

iphone開発」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1049865/35617878

この記事へのトラックバック一覧です: retain autorelease ドット演算子:

« iphone 開発 サンプル「CoreDataBooks」を読む。3 | トップページ | iphone用アプリ「乱語」サポートページ »