3

一度に約 44 kb の JPEG をメモリに保持する必要があるアプリケーションを作成しています。アプリケーションは、メモリ不足の警告をトリガーする前に約 22 メガバイトを使用できると聞いたので、これを実行できるはずだと確信しています。ただし、ロードされたメガバイトを通過すると、コンソールに次のメッセージが表示され始めます。

月 6 月 8 日 16:37:19 不明な configd[21]: カーネル メモリ イベント (90)、フリー: 374、アクティブ: 1736、非アクティブ: 959、パージ可能: 0、有線: 6260
月 6 月 8 日 16:37:20 不明な configd[21]: カーネル メモリ イベント (95)、フリー: 363、アクティブ: 876、非アクティブ: 492、パージ可能: 0、有線: 6241
Mon Jun 8 16:37:20 unknown SpringBoard[22]: メモリ レベルが重要です (5%)。殺すアプリはありません。SpringBoardを殺します
Mon Jun 8 16:37:24 unknown SpringBoard[22]: Jetsaming SpringBoard...

次に、ホーム画面に戻ります。

画像をロードするために使用しているコードは次のとおりです。

#define NUM_IMAGES 40

@interface MyClass : NSObject {
    UIImageView* imageView;
    UIImage* loadedImages[NUM_IMAGES];
}

- (void)initImages;

@property (nonatomic, retain) IBOutlet UIImageView* imageView;

@end


@implementation MyClass

@synthesize imageView;

- (void)initImages {
    int i;
    for (i = 0; i < NUM_IMAGES; i++) {
        loadedImages[i] = [UIImage imageNamed:[NSString stringWithFormat:IMAGE_FORMAT, i+1]];
    }
    imageView.image = loadedImages[0];
}

@end

ここで私が間違っていることはありますか?iPhone アプリケーションは本当に 1 メガバイトのメモリしか使用できないのでしょうか?

4

2 に答える 2

15

JPEG 画像などの圧縮された画像をロードする場合、通常は圧縮されていません (表示や操作など、画像に役立つ操作を実行できるようにするためには、圧縮を解除する必要があるため)。

圧縮されていない画像は、JPEG 形式の圧縮画像が占める44 KiB よりも確実に大きくなります (およそ 3 バイトまたは 4 バイトに幅と高さを掛けた値)。そのため、JPEG のサイズだけを見て思ったよりも早くメモリ不足になります。

本当に JPEG をメモリに保持する必要があるだけである場合 (そして、JPEG を保持するだけで何もしない場合) は、生のバイト ストリームをメモリに格納し、本当に必要な場合にのみイメージとしてロードすることを検討できます。

しかし、何をする必要があるかによって、他の選択肢があるかもしれません。一度にメモリ内のすべての画像が本当に必要ですか? メモリを節約するために、必要になるまで 1 つのイメージのロードを延期できますか (そして、その時点で他のイメージをアンロードできますか)。キャッシュできる各画像から特定の情報のみが必要ですか (その後、画像自体はもう必要ありません)? など ...

于 2009-06-08T23:55:46.507 に答える
1

imageNamed:画像データを解凍し、解凍したデータキャッシュします。imageWithContentsOfFile:そのメソッドは圧縮されたデータのみを保存し、描画時にオンザフライでデコードするため、使用しても問題ないと思います。

SO の質問に対する回答を参照してくださいUIImage imageNamed: FUD の払拭

具体的には、次のことができるはずです。

[UIImage imageWithContentsOfFile:[[UIBundle mainBundle] pathForResource:@"filename" ofType:@"jpeg"]];
于 2009-06-09T00:13:11.713 に答える