2

NSURLSessioniOS 7 以降を使用してファイルをダウンロードするアプリがあります。次のようにタスクを開始します。

//property declared: @property (retain) NSURLSession *session;

NSString *addr = @"http://www.example.com/path/to/nontrivial/file.dat";
NSURL *url = [NSURL URLWithString:addr];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
self.session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
[[self.session downloadTaskWithRequest:request] resume];

完了ハンドラー ( URLSession:downloadTask:didFinishDownloadingToURL:) で、ファイルをアプリケーション データ フォルダーに移動invalidateAndCancelし、セッションで呼び出します。プログレス ハンドラー ( didWriteData:totalBytesWritten:totalBytesExpectedToWrite:) では、進行状況をログに記録するだけです。

これがデバッグで実行されると、メモリ使用量が急速に増加し、ダウンロードされたデータ量の数倍になります。ただし、バックグラウンド タスクで実行すると、メモリ使用量は一定になります。

ダウンロード タスクで既定のセッション構成を使用するのはよくありませんか? 設定すべきキャッシュ プロパティはありますか? 何が起きてる?

更新:私が知る限り、これはデバッガーが接続されている場合にのみ発生します。デバッガーを使用せずにシミュレーターで起動すると、アクティビティ モニターでメモリ使用量の増加が見られません。

更新 2:これは iOS 8.3 で修正されたようです。わーい!

4

1 に答える 1

0

これと同じ動作が私に起こっていました。メモリが枯渇したときのハード クラッシュによってそれが現れていました。この同じ問題が発生しているかどうか知りたい人は、次の手順に従ってください...

  1. iOS シミュレーターと一緒にアクティビティ モニターを開き、[メモリ] タブに移動して、検索結果にアプリの名前を入力します。
  2. xcode を介してシミュレーターでアプリを実行します。プロセスがアクティビティ モニターに表示されるまで待ってから、1 つか 2 つのダウンロードをキューに入れます。アクティビティ モニターは、アプリのメモリ使用量が制御不能になっていることを示します。
  3. xcode でアプリの実行を停止します。Xcode を使用せずに、シミュレーターでアプリを再起動します。アプリが再びアクティビティ モニターに表示されるのを待ち、さらにいくつかのダウンロードを待ち行列に入れます。今回は、アプリのメモリ使用量は基本的に同じままである必要があります。

これは、あなたにとって本当に素晴らしい観察でした。この道を調べようとは思いもしませんでした。ありがとう!

于 2015-03-04T23:18:09.853 に答える