トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

iPhone開発 UIImageとキャッシュ

http://iphone-dev.g.hatena.ne.jp/grimleaper/20090221
http://d.hatena.ne.jp/mswar/20090221/1235238034

OS 3.0以降

imageNamedでもちゃんとメモリ管理してくれるみたい。

OS 2.21以前

 キャッシュについて

-initや+image系

ほかのクラスと同じように、retainCountが0になると解放される。

+imagedNamed:

パスをKeyとして、イメージをキャッシュする。
同じ画像を何度も使うときには最適。

問題

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

対策

基本的にはinit系で画像を作り、何度も使い回す場合は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系とは全く違う何かがあるのかもしれない。

[カテゴリ: プログラミング言語 > Objective-C]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2012年07月08日 10時54分49秒