So-net無料ブログ作成

release して null を詰めるメソッド

release して null(nil) を詰めるメソッド

久しぶりにポインタとかを扱うとすっかりわすれていたのでメモ。

UIImageView(のポインタのポインタ)を受け取って、release して、removeFromSuperview
してnilを詰める。
- (void) releaseUIImageView:(UIImageView**) p_iv {
UIImageView* i = *p_iv;
[i removeFromSuperview];
[i release];
(*p_iv) = nil;
}

使い方は
UIIMageView* iv=[[UIImageView init] alloc];
[self addSubview:iv];
[self releaseUIImageView:&iv];

という感じでポインタのアドレスを渡す。

配列に入れたUIリソースの解放 [iphone]

配列に入れたUIリソースの解放
メンバ変数で
NSMutableArray* imgList;

というのを持って、画像というかUIImageViewから派生させた自作クラスの
ClickableImageViewというのを管理している。

で、ただ単に
[imgList release];

しても中のそれぞれの要素の release はしてくれないことに気がついた。

とりあえず次をやってみたらちゃんと解放された(deallocが呼ばれた)。もっと自動的にやってくれる方法はないだろうか。。。
while([imgList count] != 0) {
int idx = [imgList count]-1;
ClickableImageView* last = [imgList objectAtIndex:idx];
[last removeFromSuperview];
[last release];
[imgList removeObjectAtIndex:idx];
}
imgList release];
imgList = nil;

UIリソースの解放 [iphone]

cメンバ変数で
ClickableImageView* m_iv;
というUIImageViewの派生クラスのオブジェクトをもっているのだが、実はiphoneプログラミングでのUIリソースの解放がよくわかっていなかったのでメモ。

生成&画面に表示はViewControllerのなかで
m_iv = [[ClickableUIImageView alloc] init];
[self.view addSubview:m_iv];

解放は
[self.view removeFromSuperview];
[m_iv release];
しなければならない。

addSubviewでretainCountが+1され、removeFromSuperviewで-1され
るようだ。

NSLoc(@"retainCount=%i",[m_iv retaionCount]);
でretainCountを出力してみると addSubview 直後は2になっていて、
解放するときはなんと3になって勝手に1増えていた。しかし上記の解放
方法で(retainCountは1までしか戻らないが)deallocは呼ばれた。呼ばれた
ときのコールスタックをみるとAutoReleasePoolなるものから呼ばれていた。
自動的に管理されるのかよくわからないが、とにかく上記解放コードは実行しなければ、
画像を取り替えてm_ivを再利用するときにリークするので、忘れずに実行したい。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。