0

私は、リソースをダウンロードして後でオフラインで使用できるようにディスクに書き込むアプリに取り組んでいます。これは常にカスタムコンテンツです。現在、約4000のJPGがあるコンテンツを処理しています。ユーザーはiPadへのコンテンツのダウンロードを初期化し、UIにプログレスバーがあるため、ユーザーは基本的に完了するまで待機します。問題は、約180〜190 MBのメモリが割り当てられ、クラッシュすることです。

Instrumentsで見たのは、CFData(ストア)が主な原因であり、CFData(ストア)がNSURLConnection要求のキャッシュであるということです。

私はもう試した:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

[[NSURLCache sharedURLCache] removeAllCachedResponses];

キャッシュポリシーを設定するだけでなく、改善はありません。

参考までに、これは私の投稿リクエストがどのように見えるかです:

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

NSString *contentType = [NSString stringWithFormat:@"text/xml"];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[xmlMessage dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postBody];

//get response
NSHTTPURLResponse* urlResponse = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&httpError];

どんな助けでも大きな拍手で満たされるでしょう。

4

1 に答える 1

0

同期リクエストでこれを本当に実行したい場合は、各リクエストで使用されているオブジェクトを明示的にリタイアして解放することを検討してください。自動解放プールを使用するということは、プールが空になるまで、すべての要求からの残りの残骸が自動解放プールに残ることを意味します。

これらのリクエストを処理するforループまたはその他のループがある場合は、ループ内によりローカルな自動解放プールを作成し、ループが終了する直前にそれを排出することもできます。これを行い、そのループ(およびプール)の範囲を超えて保持したいデータがある場合は、そのデータをループ内に保持し、後で解放する必要があります。

ある時点で、経験レベルに応じて、これをすべてセカンダリスレッドで実行することを検討する必要があります。各フェッチを自己完結型の操作として扱い、NSOperationやNSOperationQueueなどを使用して管理できます。これにより、複数の操作を同時に起動し、各応答を待っている間にスレッドをブロックすることがなくなります。

于 2012-02-23T18:23:51.890 に答える