retain, release, autoreleaseについて考える
Objective-C のコードを書いていると、理解しているはずなのに、ときどきわからなくなる。
そう、retain、release、autorelease の3兄弟だ。
この例はとってもシンプル。何をしたいのか理解できないが。
- (void) hoge: (id)obj { UIView *aView = [[UIView alloc] initWithFrame:CGRectZero]; [myView addSubView:aView]; [self hoge:obj]; }
どうやら UIView のインスタンスを作って、myView に追加したいらしい。
だけど、このコードだと、aViewがメモリリークする。
2行目で、aViewのretainCountが1になる。
3行目で、myViewがaViewを使うことになるので、aViewのretainCountが2になる。
そして、このスコープを抜ける・・・aViewのretainCountは2のまま。
myView が release されると aView の retainCount は1になる。ゼロにならない。
だからこのように書くのがいい。
- (void) hoge: (id)obj { UIView *aView = [[UIView alloc] initWithFrame:CGRectZero]; [myView addSubView:aView]; [aView release]; // この後、aViewは使わないからreleaseする [self hoge:obj]; }
もしくは aView 生成時に autorelease しておく。
- (void) hoge: (id)obj { UIView *aView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; [myView addSubView:aView]; [self hoge:obj]; // aView は relase 予約済みなので気にしなくていい。 }
あ、retain について触れてなかった。