S3GetObjectRequest には、ダウンロードするすべてのデータを追加する NSMutableData* 本体があります。
大きなファイルの場合、ダウンロードが進行するにつれてデータが絶えず追加され、VM の制限である 90MB を超えると、iOS によってアプリが強制終了されます。
手っ取り早い回避策は、独自の S3GetObjectRequest および S3GetObjectResponse クラスを作成することです。AWS フレームワークは、リクエストのクラス名に基づいてレスポンスをインスタンス化します (最後の 7 文字「リクエスト」を除いたリクエストのクラス名に「レスポンス」を追加し、その名前の新しいクラスをインスタンス化しようとします)。
次に、-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)dataをオーバーライドして、常にボディを解放します。
一定のデータ割り当て、追加、および解放がまだ行われているため、これは簡単で汚い修正です。でもピンチの時は効きます。150 ~ 700 MB のファイルをダウンロードする私の使用法では、この単純なハックにより、アプリのメモリ使用量が平均 2.55 MB、+/- 0.2 MB に維持されました。
ASIHTTP ライブラリの作成者が述べているように、これはもはや維持されていません。
リクエスト - LargeFileS3GetObjectRequest.h
@interface LargeFileS3GetObjectRequest : S3GetObjectRequest
@end
リクエスト - LargeFileS3GetObjectRequest.m
@implementation LargeFileS3GetObjectRequest
@end
レスポンス - LargeFileS3GetObjectResponse.h
@interface LargeFileS3GetObjectResponse : S3GetObjectResponse
@end
レスポンス - LargeFileS3GetObjectResponse.m
@implementation LargeFileS3GetObjectResponse
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// allow original implementation to send data to delegates
[super connection:connection didReceiveData:data];
// release body and set it to NULL so that underlying implementation doesn't
// append on released object, but instead allocates new one
[body release];
body = NULL;
}
@end
それが役に立てば幸い。