Hatena::Groupiphone-dev

iOS プログラミングメモ

2009-01-18 (Sun)

UIImage の autorelease に期待して損した話 23:07  UIImage の autorelease に期待して損した話 - iOS プログラミングメモ を含むブックマーク

UIImageView の中のイメージを次々とっかえるようなコード書いたらメモリが右肩上がりになってしまって困った事になりました。UIImageView を解放してしばらくするとメモリも減るんですけど、わけわからん状態です。デカい画像の入れ替えが発生するのでメモリ不足で愛しの iPhone もクラッシュです。

サンプル

普通にスッキリ書こうとするとこんな感じでしょうかね。クラスメソッドで UIImage を作って入れ込むと。

UIImageView *imageView;

- (void) nantoka:(NSString *):imagePath) {
   imageView.image = [UIImage imageWithContentsOfFile:imagePath];
}

このクラスメソッドからインスタンスを生成する方法だと、自動的に autorelease されるわけなんですけど、厳密にメモリ管理したい場合は alloc init してから自分で release すると確実だよって、先月誰かに教えてもらいました。

それを踏まえて書き換えると。

- (void) nantoka:(NSString *):imagePath) {
   UIImage *img  = [[UIImage alloc] initWithContentsOfFile:imagePath];
   imageView.image = img;
   [img release];
}

なんつーかもう、一々冗長なんだよねぇ。

yamionpyamionp2009/01/20 23:24autoreleaseのタイミングを調整したい時は、自分でNSAutoreleasePoolのインスタンスを作成し、処理の最後にそのインスタンスをreleaseすればそのタイミングでその間のautoreleaseのオブジェクトは全て解放されます。
for( ...){
id hogePool = [[NSAutoreleasePool alloc] init];
// 処理
[hogePool release];
}
のような形にしておけばループ毎に必ず解放されることになります。
プール自体の解放を忘れないようにすれば便利な仕組みなので、コードの削減に役立つかもしれません。

ktakayamaktakayama2009/01/20 23:51ああ、確かに NSAutoreleasePool 使えば大丈夫かもしれないですね。
でも今回はループってわけでもないので、ちょっと違うかなと思います。
UIImageView の挙動が変だろって事なんで。
いま試してみたら再現出来なくて、詳しく調べられてませんが。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090118