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系とは全く違う何かがあるのかもしれない。
[通知用URL]
Tweet
最終更新時間:2012年07月08日 10時54分49秒