3

アプリに次のコードがあります。

var newImage = // ...

if (imageView.Image != null && imageView.Image != newImage)
    imageView.Image.Dispose ();

imageView.Image = newImage;

関連する質問が 3 つあります。

  • 以前のによって占有されていたメモリをすぐに解放しますimageView.Imageか?
  • もしそうなら、よりクリーンな解決策はありますか?
  • これは何か関係がありNSAutoreleasePoolますか?
4

1 に答える 1

6

前のimageView.Imageが占有していたメモリをすぐに解放しますか?

すぐではありませんが、ガベージ コレクターを待つよりもはるかに高速です。

を呼び出すと、マネージ参照がネイティブDisposeにドロップされます。他に (ネイティブに) (RetainCount == 0) への参照がない場合は、解放されます (ObjC 参照カウント)。 UIImageUIImage

あなたのコードでは、そのプロパティがに設定されるimageViewまで、まだそれへの参照があります。ImagenewImage

もしそうなら、よりクリーンな解決策はありますか?

あまり。GC に作業を任せると見た目がきれいになりますが、画像が非常に大きくなる可能性があり、できるだけ早く解放する価値があります。

また、ローカル変数を追加して (他のネイティブ参照が存在しない場合) 画像がすぐに解放されるようにすることは、実際には価値がありません (とにかくクリーンではありません)。これは次の行で行われます。

これは NSAutoreleasePool と関係がありますか?

なんでも ?どちらの場合もメモリに関連しています。

イメージを作成すると、現在のイメージが使用 (キャッシュ)NSAutoreleasePoolされ、最終的には排出されます。大量のもの (ループなど) を処理する場合は、多くの場合、より高速なドレインを確保するために、独自の短期間のプールを持つ価値があります。

いくつかの API (多くのメモリを必要とすることはよく知られています) は、自動的に (btouch) を追加する属性で装飾されていますが、どれNSAutoreleasePoolを見つけるのは簡単ではありません。

Apple Instruments を使用して測定した方がよいとは思えません...

于 2013-04-24T22:07:00.573 に答える