0

iOS(5.1、6.0、6.1)のNSURLConnectionで厄介な問題に直面しています。
httpリクエストを介してデータの大部分をダウンロードしようとすると、アプリはリリースされたデータを実際にリリースされたものとしてマークしません(これについては後で説明します)。

私のダウンロードコードは次のようになります。

NSURL *url = [NSURL URLWithString:@"http://my.server/file.zip"];  
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];  
NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];  
[urlConnection start];

デリゲートは私のビューコントローラです。
このコードはメインの実行ループで呼び出されます(ディスパッチキューやそのようなセレクターの実行はありません)。
Delegateは、受信したデータに対してまったく何もしません-保持もコピーもありません-何もしません。

問題は、新しく作成されたプロジェクトでこのコードを呼び出すと(正常に動作します)、すべてのデータをダウンロードして問題なく終了することです。

しかし、他のアプリケーションでコードが呼び出されると、ダウンロードされたすべてのデータが突然アプリケーションにメモリフットプリントを残し、しばらくするとメモリが不足すると、アプリはメモリ警告を受け取り、クラッシュします。

あなたは言うかもしれません-あなたの代理人はデータを保持し、それを解放しません。さて、私は楽器で解決策を見つけようとしました。推測してください-私のアプリは、リソースをダウンロードしている間、約10 mbのRAMを保持していることを割り当てに示しています!割り当てにもVMトラッカーにも何も表示されません。

では、アプリがダウンロードされたデータのメモリフットプリントを保持していることをどうやって知ることができますか?

これは私の記憶レポートを表示するためのコードです(このサイトのいくつかの回答で以前に見つかりました-今は見つかりません:

    -(void) report_memory {  
       struct task_basic_info info;  
       mach_msg_type_number_t size = sizeof(info);  
       kern_return_t kerr = task_info(mach_task_self(),
                                      TASK_BASIC_INFO,
                                      (task_info_t)&info,
                                      &size);  
       if( kerr == KERN_SUCCESS ) {  
          STLog(ST_DEBUG, @"Memory in use (in bytes): %u b ( %u mb )", info.resident_size, info.resident_size / (1024 * 1024) );  
       } else {  
          STLog(ST_DEBUG, @"Error with task_info(): %s", mach_error_string(kerr));  
       }  
   }

あなたへの私の質問は-ここで何が起こっているのですか?
アプリがメモリフットプリントを表示するのはなぜですか?
なぜ楽器は過度の割り当てを示さないのですか?
NSURLConnectionによる過剰な割り当ての原因は何でしょうか?

PS。また、ディスク、メモリ、他のキャッシュポリシーを使用して、共有キャッシュサイズを変更しようとしましたが、何も役に立ちませんでした:(

4

1 に答える 1

2

ゾンビ オブジェクトを使用すると、NSURLConnection は割り当て解除されたオブジェクトを保持することが判明しました。これにより、それらが完全に解放されるのを防ぎます-したがって、メモリフットプリント。

解決策は、NSURLConnection 経由で大量のデータをダウンロードする際にゾンビ オブジェクトを使用しないことです。

于 2013-02-08T07:57:33.043 に答える