2

imageWithDataを使用してインスタンス化するUIImageがあります:(データは[NSDatadataWithContentsOfFile:]を使用してバンドルからロードされます)。

次に、次のように画像を描画します。

NSData *imageData =  [NSData dataWithContentsOfFile:fileLocation];
UIImage *myImage = [UIImage imageWithData:imageData];

//These lines are superfluous from what I can tell, replacing with
//UIImage *myImage = [UIImage imagedNamed:imageName]; very soon.

[myImage drawAtPoint:CGPointMake(0,0)];
//myImage will be released at the end of the run loop

私の質問はこれです:作成されたUIImageは自動リリースされます。UIImageがビューに描画され、UIImageの割り当てが解除されると、メモリに関して何が起こりますか。明らかに、視覚的には、コンテキストに描画されているため、画像はまだそこにあります。

UIImageが有効で、ビューに描画された場合、メモリ使用量は2倍になり、UIImageの割り当てが解除された後、UIImageが1つだけ存在した場合と同じ量に戻りますか?


今、別のルートを下ります。

[UIImage imageNamed:]を使用して画像をインスタンス化した場合、UIImageクラスには独自の種類の画像キャッシュがあり、特定の画像の1つの真のインスタンスのみを保持します(その1つの画像を表すために作成されたUIImageインスタンスの数に関係なく) )。

私の他の質問は次のとおりです。コンテキストに画像を描画してからUIimageが解放された場合(実行ループの最後に自動解放を介して)、キャッシュ内の画像はどうなりますか?画像はキャッシュに残り、メモリを消費しますか?他のUIImageインスタンスが使用していないため、削除されていますか?

どんな助けでも素晴らしいでしょう、ありがとう!

4

3 に答える 3

1

ここで簡単なコードから始めて、実際に問題が発生している場所を最適化することを強くお勧めします。あなたが説明している種類のスペースの最適化は、深刻な時間の問題を引き起こす可能性があります(たとえば、UIImageの再作成-drawRect:は非常にコストがかかります)。そうは言っても、さまざまな質問を見てみましょう。

  • まず、私が言ったように、で高価な仕事をすることに注意して-drawRect:ください。呼び出される頻度やタイミングを制御することはほとんどできません。ここでのコストのかかる作業(特にディスクから読み取る必要がある場合は、新しいUIImageの作成など)は、UIのパフォーマンスに深刻な影響を与える可能性があります。

  • 私はあなたにこれよりももっとたくさんあると思います-drawRect:、正しいですか?UIImageView速度とメモリの両方で、ここで行ったことに合わせて最適化されています。ただし、ビューがはるかに複雑な場合は、多数のサブビューを作成するよりも、自分で画像を描画する方が適切です。

  • すでに述べたように、を呼び出す-drawAtPoint:と、作成するコピーはビットマップ表現になります(他の描画とブレンドされます)。メモリ使用量の点では、元のUIImageとは関係ありません。一方を他方と交換することはできません。ビットマップ表現に必要なメモリは、ビューサイズとビット深度の関数であり、変更することはできません。描画後にUIImageが存在するかどうかは関係ありません。

  • -imageNamed:あなたのためにキャッシングを行い、一般的に良い選択です。メモリが少ない状況では、キャッシュをクリアしないことに注意してください。UIImage自体は、ファイルからロードされた場合、基になるデータを透過的にダンプします(いずれの場合も、追加の表現をダンプします)。UIImageリファレンスには、これがどのように行われるかに関する情報が含まれています。

  • これらの画像(空間または時間)のパフォーマンスに非常に関心があり、UIImageの機能が必要ない場合は、CGImagesを使用する必要があります。これらはUIImagesほど柔軟ではなく、コーディングがより複雑ですが、より効率的です。そうは言っても、UIImagesはほとんどの目的に適しています。

于 2009-08-18T14:33:01.087 に答える
1

どの時点でも、「コンテキストに描画」すると、コンテキストは画像への参照を保持しません。代わりに、描画は実際のピクセルのビットをコンテキストに配置するため、UIImage (またはそれに描画されたもの - NSString、NSPath など) への参照は必要ありません。

に関してimageNamed:は、実際にリリースされることはありません。取得するのは、リリースしない (そしてリリースすべきではない) 参照ですが、キャッシュされたイメージはまだそこにある可能性があります。

于 2009-08-18T13:40:29.917 に答える
0

UIImage インスタンス自体を作成している場所に大きく依存します。これが UIView サブクラスの場合、UIImage をどこか、またはどこかで作成して-drawRect:-initWithFrame:ますか? イメージを 1 回 (init または保持するセッターなどで) ロードする場合、問題はありません。ただし、イメージを何度も作成している場合、-drawRect:少なくともパフォーマンスの問題が発生します。

于 2009-08-18T13:45:31.457 に答える