(iOS6,7)NSURLConnectionで大容量のデータをアップロードするとメモリ枯渇でアプリが終了

大容量の動画や写真をサーバーにアップロードする処理を作っているのですが、
NSURLConnectionのBodyに設定するため、mallocしたときにメモリが枯渇してアプリが終了してしまいます。

NSURLConnectionで端末の空きメモリ以上のデータを送信するためにはどのようにしたらよいでしょうか。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/02/20 19:58:48
  • 終了:2014/02/27 20:00:05

回答(3件)

id:snow0214 No.1

snow0214回答回数470ベストアンサー獲得回数1162014/02/20 22:43:25

ポイント100pt

このコードでキャッシュメモリをゼロにしてみてください。

 [[NSURLCache sharedURLCache] setMemoryCapacity:0];
id:ankomoti3260

コメントありがとうございます。
すみません。質問内容が悪かったです。
setHTTPBodyに設定する際、NSDATAに変換する必要があり、大容量のデータ(動画など)の場合はメモリ枯渇が発生クラッシュしてしまう状況でした。

最終的にはAFNetworkingで実現することが出来ました。

2014/02/28 13:08:21
id:ankomoti3260

 具体的にはmultipart/form-dataで動画や画像などのバイナリデータ(端末の空き容量以上のデータ1GBなど)をサーバーに送る際に、NSDataに読み込もうとする箇所でメモリが枯渇しアプリが終了する状況です。

[postData appendData:NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"\r\n",@"test.jpeg"]
dataUsingEncoding:NSUTF8StringEncoding;

[postData appendData:NSString stringWithFormat:@”Content-Type: image/jpeg¥r¥n¥r¥n”] dataUsingEncoding:NSUTF8StringEncoding?;

NSData *fileData = NSData alloc] initWithContentsOfFile:inputFilePath];

id:bg5551 No.2

bg5551回答回数1184ベストアンサー獲得回数802014/02/26 09:43:48

ポイント100pt

こちらは参考になりませんか。
http://blog.mudaimemo.com/2010/04/objective-cautorelease.html

id:nikodesu No.3

ニコ回答回数1025ベストアンサー獲得回数392014/02/27 16:23:46

ポイント100pt

こういったところも
http://d.hatena.ne.jp/touka_tt/20120712/1342031185

id:ankomoti3260

コメントありがとうございます。
すみません。質問内容が悪かったです。
参照先のページを拝見したかぎり、setHTTPBodyはNSDATAのため、大容量のデータ(動画など)をNSDATAに変換するときにメモリ枯渇が発生クラッシュしてしまうのではないでしょうか。
setHTTPBodyStreamもあったのですが、大容量の動画データをmultipart/form-dataにする方法が見つけられなかったため、AFNetWorkingのライブラリで代用しました。

2014/02/28 12:58:20
id:ankomoti3260

色々調べた結果、AFNetWorkingのライブラリで実現出来ました。
filePathUrlには@"file://形式のパス"

HTTPRequestOperationManager *manager = [HTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer new];

NSDictionary *params = @{@“param”: @“param”};
NSMutableURLRequest *request;
[request setTimeoutInterval:60];

request = [manager.requestSerializer multipartFormRequestWithMethod:@"POST"
URLString:urlStr
parameters:params
constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileURL:filePathUrl
name:@"file"
fileName:fileNameStr
mimeType:@"application/octet-stream"
error:nil];
}
error:NULL];

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません