0

2つのクエリがあります

  1. 単一のView Controllerを実装したサンプルアプリを実行していました。Instrument を使用してメモリを確認すると、3.66 MBと表示されていました 。アプリにはそれほど重いものがないのに、なぜそんなに多くのRAMを消費しているのか疑問に思いました.

  2. サイズが25 KBのイメージで UIImageview を追加すると、メモリの使用量が4.24 MBになります [背後にある理由は「イメージがアンパックされた320*480*4 = 580 KB
    」で あることがわかりますが、これについてさらにデバッグする必要があります& キャッシュに残ります]

これに沿って、私は2つのシナリオも観察しました

  1. 画像の読み込みに api を使用する場合[UIImage imageNamed:aName]、呼び出し[UIImageview release]は何の効果もありません。

  2. しかし、私たちが使用するとき

[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:aName ofType:nil]];

呼び出すと一部のメモリがクリーンアップされます[UIImageview release]

私のアプリでは、大量の画像を使用する予定です。これにより、メモリが不足し、アプリがクラッシュします。

この動作の理由を分析するための参照またはパスを提供してください。

ありがとう、

サーガル

4

2 に答える 2

2

アプリをメモリに収めようとするのは負けゲームです。実行しているデバイスの種類を把握しようとしたり、それに基づいてリソースをスワップインおよびスワップアウトしたりするなど、奇妙な道をたどります。

より良いオプションは、メモリ構造を破棄できるように設計し、メモリ不足の状態が通知されたときにかなり厳しい破棄レジメンをサポートすることです。先に進んでメモリを使用してください-それはそのためにあります-メモリ不足の警告が未使用のリソースを取り除くための合図になります。

多くの人は、自分のアプリケーションがメモリ警告を生成することに気分を害しているようです。それはばかげている。ここでの設計パターンは、好きなだけ食べますが、太りすぎだと言われたら適切に対応することです。さまざまなメモリ プロファイルを持つさまざまなデバイスで実行していることを考えると (たとえば、iPhone 3G の RAM は iPhone 4 の 1/4 です)、最善の方法は、メモリがいっぱいになったときに敏感になることです。メモリー。

遭遇する主なハードルは、データを破棄した状態からの回復です。UIImage オブジェクトを明示的に に設定nilし、それらを使用する前に nil をテストし、必要に応じてバンドルやネットワークなどからリロードするのが最適です。

とは言っ[UIImage imageNamed:]ても、使い道はサポートされていますが、それを制御することはできません。UIViewController サブクラスがメモリ警告を受け取ると、そのメソッドで作成したキャッシュされた UIImage を破棄しますが、それまでは何もできません。問題のUIImageに小さなものを割り当てても、割り当てられたオブジェクトではなく、「名前」である「名前」に関連付けられてキャッシュされるため、役に立ちません。その方法は、再利用するイメージには適していますが、それでも、いざというときに剪定されてしまうので、適切に対応する必要があります。

于 2010-08-24T12:09:00.487 に答える
0

imageNamed で読み込まれた画像は UIKit によってメモリにキャッシュされますが、imageWithContentsOfFile で読み込まれた画像はキャッシュされません。

于 2010-08-24T09:26:44.803 に答える