2

うちの会社はiPadアプリで利用するWebサービスを作っていて、社内でiOSの開発経験がないので、外注しました。

初期化プロセスの一環として、アプリは Web サービスからデータの開始セットを JSON 形式で受け取ります。ほとんどのアプリ ユーザーの場合、このデータ セットのサイズは約 4 MB (非圧縮) で、アプリはこれを問題なく処理します。

小規模なユーザー グループの場合、データ サイズはさらに大きくなり、非圧縮で約 65 MB になります。このデータ セットを使用すると、iPad アプリがクラッシュします。開発者は、アプリが大量のメモリを使用しているために強制終了されたと主張しています。私がそれらを正しく理解していれば、JSON をメモリ内オブジェクトに解析しようとしているときにこれが発生していると言っています。

私の感覚では、メモリが 1 GB のデバイスで 65 MB のデータを処理しても問題はないと思いますが、これを基にする iOS 環境の経験がありません。

iOS で大量の JSON データを処理できた人はいますか? 問題が JSON データ セット全体をメモリにロードすることにある場合、メモリ使用量が少ない iOS 用のストリーミング JSON パーサーはありますか?

4

1 に答える 1

1

json を NSDictionaries/NSArrays/NSStrings/NSNumbers に変換することに問題があるとは思いません。

私の推測では、自動解放されたプールが空になる前にすべての画像のサムネイルを作成するなど、自動解放されたオブジェクトで json の結果をタイトなループで使用していると思います。

それらがあなたのデータが行っていることに適合しない場合、データ セットに対してどのような種類の作業が行われているかについて例を挙げていただけますか?

これは非常に悪いコードです。圧縮されていない uiimages を autorelease プールにスタックし続け、すべてのイメージがダウンロードされてサムネイルが作成されるまでヒットしません。

NSArray* images = [jsonObject objectForKey:@"images"];

for(NSString* imageURL in images){
    NSURL* url = [NSURL URLWithString: imageURL];
    NSData* data = [NSData dataWithContentsOfURL: url];
    UIImage* image = [UIImage imageWithData: data];
    // write image to disk
    UIImage* thumbnail = CreateThumbnailFromImage(image);
    // write thumbnail to disk
}

自動解放されたオブジェクトをより早くクリーンアップする別の自動解放プールを追加することで、同じコードを修正できます。

for(NSString* imageURL in images){
    @autoreleasepool {
    NSURL* url = [NSURL URLWithString: imageURL];
    NSData* data = [NSData dataWithContentsOfURL: url];
    UIImage* image = [UIImage imageWithData: data];
    // write image to disk
    UIImage* thumbnail = CreateThumbnailFromImage(image);
    // write thumbnail to disk
    }
}
于 2012-06-29T20:49:03.517 に答える