tldr:ImagedNamedは問題ありません。メモリをうまく処理します。それを使用して、心配しないでください。
2012年11月編集:この質問はiOS 2.0からの日付です。それ以来、画像の要件と処理が大きく前進しています。網膜は画像を大きくし、それらを少し複雑にします。 iPadと網膜画像のサポートが組み込まれているので、コードでImageNamedを使用してください。後世のために:
アップルデベロッパーフォーラムのsister threadは、より良いトラフィックを受け取りました。具体的にはRincewindに権限が追加されました。
メモリ警告の後でも、imageNamed:キャッシュが消去されない問題がiPhone OS 2.xにあります。同時に+ imageNamed:はキャッシュ用ではなく、利便性のために多用されていますが、おそらくこれ以上問題を拡大してしまったでしょう。スピード面では
は、何が起こっているかの一般的な誤解があることを警告しながら
。 + imageNamed:が行う最も大きなことは、ソースファイルから画像データをデコードすることです。これは、ほとんどの場合、データサイズを大幅に膨らませます(たとえば、画面サイズのPNGファイルは圧縮されたときに数十KBを消費しますが、解凍 - 幅*高さ* 4)。対照的に、+ imageWithContentsOfFile:画像データが必要になるたびに、その画像を解凍します。あなたが想像することができるように、画像データが一回だけ必要な場合は、キャッシュされたバージョンの画像がぶら下がり、必要以上に長い可能性があります。しかし、頻繁に再描画する必要がある大きなイメージを持っている場合は、代替案がありますが、主に推奨するのは、大きなイメージを再描画しないようにすることです。
キャッシュの一般的な動作に関しては、ファイル名に基づいてキャッシュを行います(同じ名前の2つの+ imageNamed:は同じキャッシュデータへの参照になります)。 + imageNamed経由でさらに画像をリクエストする: iPhone OS 2.xでは、メモリ警告が受信されたときにキャッシュが縮小するのを防ぐバグがあります。
と
私の理解では、ということ+ imageNamedです:キャッシュはiPhone OS 3.0上のメモリの警告を尊重すべきです。あなたがチャンスを取ったときにそれをテストし、そうでないとわかったらバグを報告してください。
だから、あなたはそれを持っています。 imageNamed:窓を壊したり子供を殺したりしません。それはかなりシンプルですが、最適化ツールです。
// header omitted
// Before you waste time editing this, please remember that a semi colon at the end of a method definition is valid and a matter of style.
+ (UIImage*)imageFromMainBundleFile:(NSString*)aFileName; {
NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
return [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", bundlePath,aFileName]];
}
:私はそれを修正するためにUIImageにカテゴリを追加しましたので、人々はそれを酷使し、それは単にその仕事
をしたときに怒る - 悲しいことに、それはひどく名前を付けて使用するように簡単です何equivaluentはありません
Rincewindには、独自の最適化バージョンを構築するためのサンプルコードも含まれています。私はそれがmaintentaceの価値があることを見ることができませんが、ここでそれは完全性のためです。
CGImageRef originalImage = uiImage.CGImage;
CFDataRef imageData = CGDataProviderCopyData(
CGImageGetDataProvider(originalImage));
CGDataProviderRef imageDataProvider = CGDataProviderCreateWithCFData(imageData);
CFRelease(imageData);
CGImageRef image = CGImageCreate(
CGImageGetWidth(originalImage),
CGImageGetHeight(originalImage),
CGImageGetBitsPerComponent(originalImage),
CGImageGetBitsPerPixel(originalImage),
CGImageGetBytesPerRow(originalImage),
CGImageGetColorSpace(originalImage),
CGImageGetBitmapInfo(originalImage),
imageDataProvider,
CGImageGetDecode(originalImage),
CGImageGetShouldInterpolate(originalImage),
CGImageGetRenderingIntent(originalImage));
CGDataProviderRelease(imageDataProvider);
UIImage *decompressedImage = [UIImage imageWithCGImage:image];
CGImageRelease(image);
このコードとトレードオフは、デコードされたイメージがより多くのメモリを使用するがレンダリングが高速であることです。
私はサスペンス状態です。 :) – Kriem
私も。私が思ったように、SOのような天才のように見えないようです。 –
これについて調査しているようです。 UIImage imageNamedが最新のココアタッチバージョンに悪影響を与えるような実験を行ったことがありますか? UITableViewを作成し、ロット(数千)の行を追加し、すべての行に異なるイメージを表示するとパフォーマンスが低下するかどうかを確認します。おそらく人々はあなたの発見にコメントすることができます。 – stefanB