以前iPhoneアプリのメモリリークというタイトルで投稿しましたが、今回はリークしない為のメモリ管理についてです。
Objective-Cのメモリ管理は、Javaともちょっと違い、C言語ともちょっと違う感じなので、戸惑う事も多いかと思います。
Objective-Cではメモリ領域を参照している数(リファレンスカウンタ)で、メモリを使用しているかを判断して、リファレンスカウンタがゼロになった時に解放します。
参照して使う時は「retain」メッセージを、不要になった場合は「release」メッセージを送って、リファレンスカウンタの数を変更します。
ここまではすぐに分かりそうですが、以下のようなコードを見たときに少し混乱しました。
例えば、SomethingViewをnewして、サブビュートして追加する場合、
SomethingView *view = [[SomethingView alloc] initWithFrame:~];
[self addSubview:view];
[view release];
Appleのサンプルコードは、以上のようなコードになっている事が多く、releaseしてもSomethingViewが表示されるというのが違和感が有りました。
リファレンスカウンタ方式の管理が分かってしまえば、上記のコードで何をしているかも簡単に分かります。
上記のコードの場合は、addSubviewの中でretainしていて、呼び出し元でreleaseしても、参照が残っている為、viewが解放されません。
自分が書いたコードで、alloc/retainとreleaseの数が合っていれば基本問題ないのですが、いくつかはまった点がありました。
その辺りを次回書きたいと思います。
※iPhoneアプリ開発に関する投稿を今から始めるiPhoneアプリ開発にまとめました。
最近のコメント