2

returnData = [NSURLConnection sendSynchronousRequest:theRequestreturningResponse:nil error:nil]にリークがあり ます。

以下は私が使用しているコードです

    NSString* curl = @"https://Some Url?ticket=";
curl = [curl stringByAppendingString:self.ticket];
curl = [curl stringByAppendingString:@"&apikey=hjgajgfjaghjf&XMLString="];
curl = [curl stringByAppendingString:stringB];
curl = [curl stringByReplacingOccurrencesOfString:@"\n" withString:@""];
NSURL *finalURL = [NSURL URLWithString:curl];

    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:finalURL cachePolicy:NSURLRequestReloadIgnoringCacheData   timeoutInterval:10]; 
     [theRequest setHTTPMethod:@"POST"];

   NSData* returnData= [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil];

returndataでリークが発生する理由を誰かに教えてもらえますか? returndataをリリースして試しましたが、それでも発生しています。

ありがとうございました

4

2 に答える 2

9

あなたが投稿したコードから、リークはありません。最終的にreturnDataを返すと、呼び出し元がそれを保持して解放するのを忘れる可能性がありますが、提供したコードスニペット内のすべてのオブジェクトは自動解放され、現在の実行ループの終了時に解放されます。

私が考えることができるいくつかのこと:

  1. これをバックグラウンドスレッドで(performSelectorInBackground:withObject:を介して、または明示的なNSThread割り当てを使用して)実行し、コードの周りにNSAutoreleasePoolを作成して後でドレインするのを忘れていますか?

  2. NSURLConnectionのキャッシュにメモリが拘束されている可能性があります。returnDataがリークされていると思われる理由については言及していませんが、(Leaks InstrumentがreturnDataオブジェクトに特にタグを付けるのではなく)その領域のメモリが失われただけの場合は、RAMをクリアすることでRAMを解放できる可能性があります。 NSURLConnectionは、次のようなもので明示的にキャッシュします[[NSURLCache sharedURLCache] removeAllCachedResponses];

  3. NSString-stringWithFormat:実際のリークとは関係ありませんが、への複数の呼び出しの代わりにを使用してURL文字列を作成する方が少し効率的-stringByAppendingString:です。繰り返しになりますが、すべてが自動解放されるため、文字列処理にリークはありませんが、作成する一時オブジェクトが少なくなり、次のNSAutoreleasePoolドレインの前にピークメモリ使用量が減少します。

私が解決策を探す一番の場所は、このコードの呼び出し元です。このメソッドの戻り値を保持していて、ある時点で適切に解放されていない可能性はかなり高いです。また、保持されたものにリターンを割り当て、 Instruments@propertyでプロパティを最終的にゼロにしないと-dealloc、リークされたメモリが最初に割り当てられた場所がわかりますが、リークが実際に発生した場所を知る方法はありません-最後のときポインタを含む変数が上書きされるか、スコープ外になります。

まだ行っていない場合は、Xcodeのビルドおよび分析機能を使用してコードをコンパイルしてみてください。その関数によって実行されるCLANG静的アナライザーは、通常、Instrumentsでの実行時の動的分析よりも、最後の参照が失われる場所を特定できます。

これを追跡して頑張ってください!リークは決して楽しいものではありません。

于 2010-07-03T20:36:33.693 に答える
1

私は問題の逆を持っていました。キャッシュをクリアすることができませんでした。これが私がしたことです。私はさらに別のペアを追加しました。これは常に異なり、URLは常に少し異なります。追加した:

[...]

curl = [curl stringByAppendingString:@"&hello=hello"];

curl = [curl stringByAppendingString:nowStr];

where nowStr:

NSDate *now = [NSDate date];

NSString * nowStr = [NSString stringWithFormat:@"%@", now];

nowStr = [nowStr stringByReplacingOccurancesOfString:@" " withString:@""];

nowStr = [nowStr stringByReplacingOccurancesOfString:@"+" withString:@""];

乱数を使って何かをする必要があると確信しています。後でそれを行うかもしれません。

于 2012-07-09T13:36:47.887 に答える