NSURLSessionのメモリの扱いについてメモ

NSURLSessionですが、ダウンロードしたデータをオンメモリ(NSData)で渡してくれるメソッドとテンポラリファイルに書き込んで渡してくれるメソッドの両方がいます。普通に考えれば、テンポラリファイルの方は、ファイルに書きながらなので、巨大なファイルも扱えると思うのですが、iOS 8.1で見ていると、どうも中間のデータをオンメモリで持っていて、最後に書いている様子。そのため、途中でメモリ不足になって落ちてしまいます。
通信の後に、invalidateAndCancelで解放してあげないと、リークになることは明記されていますが、途中のデータの扱いがオンメモリで持っているかについては書かれていません。しかし、Instrumentsで見てみると、CFNetworkを内部で使っていて、データ受信用のコールバック関数の中で確保しているデータがダウンロード中は解放されていないことが確認できます。
これでは、巨大なファイルを落とす可能性があるアプリでは使えないですね。。。
巨大なファイルを落とす可能性があるアプリではNSURLConnectionやCFNetworkのAPIを使ってダウンロード処理を書いた方が良いようです。

関連記事

  1. 課題管理に登録する課題の粒度について

  2. VMware Fusionのヘッドレス運用

  3. セミナーで講師をしました

  4. Mac OS X ServerでのSubversionのセットアップ

  5. Sublime Text 2 というテキストエディタを試し中

  6. iCloudでのブックマーク同期はほぼリアルタイム

最近の著書

  1. 基礎から学ぶ SwiftUI

最近の記事

  1. 基礎から学ぶ SwiftUI
  2. 基礎から学ぶ SwiftUI