Hatena::Groupiphone-dev

grimleaperの開発日誌

ついったー

2009-02-21UIImageとキャッシュ

UIImageとキャッシュ

| 05:26

 http://d.hatena.ne.jp/mswar/20090221/1235238034 を読んで、僕もUIImageを触っているときに UIImageがキャッシュされるときとそうでないときがあったりして困ったのでまとめておこうと思う。

 -initや+image系

 ほかのクラスと同じように、retainCountが0になると解放される。ここまでは何も悩むことはないんですが、

 +imagedNamed:

 こいつはアップルのドキュメントに書いてあるように、パスをKeyとして、イメージをキャッシュする。なので、下手にreleaseするとメモリーリークが発生する。+imageAtPath:というundocumentedなAPIも同じようにキャッシュしてくれるので、同じ画像を何度も使うときには最適。

 問題は、ビューアーやゲームで何度も違う画像を読み込む場合。+imageNamed:だと、どんどんキャッシュが溜まっていって、いつかはメモリが足りなくなり落ちます。僕が適当に試してみた結果、10M位を超えると落ちる感じでしょうか。この辺は環境によるかもしれませんが。

 なので、基本的にはinit系で画像を作り、何度も使い回す場合はimageNamed:で読み込む。という感じでしょう。一応、undocumentedなAPIに+removeImageNameFromCache:ってのがあるけど、僕の使い方が間違っていたのか、うまく消せている感じがしなかった。

で、サンプルコード。書いてみるとやっぱりimageNamed:が使いたくなる理由はわかる。

initWithContentsOfFile:

NSString *aImagePath = [[NSBundle mainBundle] pathForResource:@"gazou" ofType:@"png"];
UIImage *aImage = [[UIImage alloc] initWithContentsOfFile:aImagePath];
aImageView.image = aImage;
[aImage release];

imageWithContentsOfFile:

NSString *aImagePath = [[NSBundle mainBundle] pathForResource:@"gazou" ofType:@"png"];
aImageView.image = [UIImage imageWithContentsOfFile:aImagePath];

imageNamed:

aImageView.image = [UIImage imageNamed:@"gazou.png"];

 これ以外にもimageNamedとそれ以外では違いがある。それはUIImageViewに画像を貼付けたときに顕著なのだけれど、最初の一回目でも、imageNamedで画像を読み込んだ方が早い。1Mくらいの画像ファイルを用意して、それをスクロールに従って順に表示するようにした場合、imageNamedとそれ以外ではUIのもたつき具合が全く違う。理由は不明。imageAtPath:でも同じように高速で動くので、init系とは全く違う何かがあるのかもしれない。

sftyv2sftyv2 2013/12/17 16:21 渡辺麻友 水着画像
http://www.gazouzou.com/AKB48/watanabe-mayu/

ゲスト