メモリ関係

 今日はObjective-Cのメモリ管理の復習をしてました。自分がよく扱ってる言語はRuby, Javascript。これらはGarbage Collectionとかあるのでメモリはあまり考えてませんでした。C言語をちょっとやってたときも、mallocとかほとんど使わなかったので無関係な感じでした← (メモリのことを考えてないといろいろまずいですね)
 ちなみにObjective-C 2.0では一応Garbage Collectionあるみたいですが、iPhoneでは使えないし、どうやら動作がちょっと鈍くなるらしい?のでなるべく使わないでいってみようと思います。


 参考にしたところ
こたつつきみかん » NSAutoreleasePool
Memory Management of Cocoa
Cocoaでいこう! Macらしく 第10回
autoreleaseされたオブジェクトはいつ解放されるか - 24/7 twenty-four seven
releaseの使いどころ : As Sloth As Possible
Life is beautiful: iPhone SDKとObjective-C:ニートは社会のメモリーリーク?!


 でもって本題ですが、Objective-CにはretainCountって物があって、それが0になると解放されるみたいです。(未だに良く理解してない)

 そしてretainCountはalloc, init, retainなどで増えて、releaseで減るみたいです。


 だいたい見つけた使い方等は以下の3つ。スーパーpreがおかしい...?

HOGE *hoge = [[HOGE alloc] init];

/* . . . */

[hoge release];
HOGE *hoge = [[[HOGE alloc] init] autorelease];

これは間違ってます、追記参照。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
HOGE *hoge = [[HOGE alloc] init];
FOO *foo = [[FOO alloc] init];

/* . . . */

[pool resease];

 1つめは使い終わったら自分で解放させる方法。
 2つめは自動で解放させてくれる方法。
 3つめは1つめと同じ考えですが、releaseまでに生成されたオブジェクトを解放させる(らしい)。

 中止すべき点は、自分で生成したオブジェクトは自分でreleaseさせる。勝手に生成させたオブジェクトはreleaseさせちゃダメだと言うこと。

NSLog(@"%d", [hoge retainCount]);

とかやるとhogeのretainCountがコンソールに表示されるっぽい。

 ということで、まだまだ理解が足りないですが、使わなくなったオブジェクトはどんどんreleaseしていこう。


 追記: NSAutoreleasePoolの使い方が間違っていました。ご指摘ありがとうございます。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
HOGE *hoge = [[[HOGE alloc] init] autorelease];
FOO *foo = [[[FOO alloc] init] autorelease];

/* . . . */

[pool resease];

 NSAutoreleasePoolはautoreleaseを送って登録させないとダメなようです。

 もうちょっと検討しないと理解不十分ですね。いろいろ書いてみて覚えようと思います。