4

ユーザーがimageWithContentsOfFileを待たないように、大きな画像をキャッシュするアプリがあります。原則として、前後の画像をキャッシュします。

1) iPad で利用可能なメモリに基づいて、このキャッシングを適応させることはできますか? はいの場合、しきい値は何ですか? 以下は、使用可能なメモリを計算する関数です

-(void) report_memory {
    struct task_basic_info info;
    mach_msg_type_number_t size = sizeof(info);
    kern_return_t kerr = task_info(mach_task_self(),
                                   TASK_BASIC_INFO,
                                   (task_info_t)&info,
                                   &size);
    if( kerr == KERN_SUCCESS ) {
        Log(@"Memory in use (in bytes): %u", info.resident_size);
    } else {
        Log(@"Error with task_info(): %s", mach_error_string(kerr));
    }
}

2) (非公開/文書化されていない API を除いて) メモリ レベルの警告を知る方法がないことはわかっています。しかし、確認のために、何らかの方法でそれらを使用できますか.

3)現在、3つの画面(6つの画像がある)をキャッシュすることを考えています。ViewControllerがメモリ警告を受け取った場合、表示されている画面を除くすべての画面をアンロードし、キャッシュする画面の数を2(4つの画像)にリセットします。しかし、キャッシュが可能な量よりも少ないか、状況によっては4つをロードしてもクラッシュするため、最適化されていません。

4

2 に答える 2

0

アプリケーションをクラッシュさせずにできるだけ多くのデータをキャッシュしたい場合は、関数 didReceiveMemoryWarning をいつでも利用して、必要に応じて余分なキャッシュを削除できます。この関数内では、すべてをクリアする必要はありません。これを使用して、現在の状況に十分なスペースを選択的にクリアし、この警告が再び発生するまでキャッシュを続行できます。

別の方法は、警告が発生するまでキャッシュ ルーチンを開始することです。これにより、キャッシュできたアイテムの数を作成できます。この回数に達したら、問題を回避するために、キャッシュの繰り返しをその回数よりもはるかに低く抑えることができます。

詳細な説明ではありませんが、目標を達成できる標準的な方法を利用するためのいくつかのアイデアがあります。

于 2012-08-30T17:55:21.843 に答える
0

長い間待っていたので、誰かの役に立つかどうか質問に答えています。

ドキュメント化されていない API を使用して警告レベルを取得し、それに基づいてアクションを実行することは避けてください。レベルに関係なくメモリ警告に対して推奨される唯一のアクションは、できるだけ多くのメモリを解放することです。report_memory 関数 (質問を参照) に基づくヒューリスティックを使用して、キャッシュできる量を決定できます。しきい値を計算するためのテストは実行していませんが (合計 RAM に基づく必要があります)。誰かがこれらのテストを実行して更新するのを見てみたい.

私の場合、メモリ警告でキャッシュするページ数をリセットするアプローチはうまく機能しています。

于 2012-08-03T10:00:14.007 に答える