iPhone や Mac OS X のアプリは Objective-C というプログラミング言語で作るのだけど、やっぱり慣れない言語というのは、暗黙のルールがわからず苦労する。
とくにわかりづらいのが alloc/retain と release の関係。
本を読んで、その動きは理解できるのだが、それがどのように運用されているのかが全く実感がないので、ちょっと実験してみた。
@interface Car : NSObject {
NSString *name;
}
@implementation Car
@synthesize name;
- (void)dealloc {
[super dealloc];
}
というクラスを作ってみて、この dealloc メソッドがどんなタイミングで呼ばれるのかデバッグしてみた。
Car *car = [[Car alloc] init];
[car release];
これで呼ばれるのは当たり前なので、
NSMutableArray *carList = [[NSMutableArray] alloc] init];
Car *car = [[Car alloc] init];
[carList addObject:car];
[car release];
[carList release];
というのを作ってみた。
これで、実際に Car のインスタンスがなくなるのは、
[car release];
ではなく、
[carList release];
の実行時だったので、NSMutableArray は addObject のときに retain をしていて、release のときに各アイテムを release してるということがわかったのだ。
なるほど。
Objective-C (というか Cocoa か?)のコレクションでは、アイテムの破棄はコレクションに任せて良いというのがスタンスらしい。
とまあ、慣れるまでは挙動を確認しながらじゃないとコーディングできないのがつらいところだな。
ってこれって当たり前なのかな・・?
Java のガベージコレクションに慣れちゃうと、メモリ管理の「当たり前」がわからなくなってしまうのがツライ。