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系とは全く違う何かがあるのかもしれない。 {{category2 プログラミング言語,Objective-C}}