2011-01-04 13 views
1

NSAutoreleasePoolがなぜこのコードに漏れているのか誰にでも教えてください。私は漏れを確認するために器具を使用しています&このコードは何らかの形で漏れています。誰かが正しい方向に私を導くことができます。私はまったく同じコードを別の場所に持っています&実行中の罰金。NSAutoReleasePool漏洩

ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:self.url]; 
[request setDelegate:self]; 

NSOperationQueue *queue = self.downloadQueue; 
[queue addOperation:request]; 
[request release]; 
+1

'[要求リリース]'の後に '[queue release]'を追加すると、リークは残りますか? –

答えて

2

そのコードの周りにNSAutoreleasePoolを作成すると、それはなくなるはずです。これは通常、このコードがメインスレッド上で実行されていない場合に発生します。

NSAutoreleasePool* pool = [NSAutoreleasePool new]; 
// Your code goes here 
[pool drain]; 

また、あなたはNSAutoreleasePool新しい/ドレインブロック内でループしている場合、あなたはドレインを打つまで漏れるように見えることに注意してください。これは、アプリ内でメモリが不足している場合でも、ループ内にあまりにも多くのメモリを割り当てている場合に起こります。その場合は、毎回ループを介して2番目のNSAutoreleasePoolを作成して排除する必要があります(またはオーバーヘッドの一部を避けるためにループをn回繰り返すこともあります)。

+0

+1を参照してください。私はしばしばautoreleaseプールを作成するスレッドエントリ上のコードを見て、スレッドが終了するまでそれを排水しません。長寿命のスレッドや、(例えば画像などの)大量のメモリを割り当てる短いスレッドの場合、プールを頻繁に排水して再作成する必要があります。 – par

1

このコードはセカンダリスレッドで実行していますか?もしそうなら、エントリー時に自動解放プールをセットアップしましたか?

+0

すべてがメインスレッドにありません私はNSAutoreleaseプール自体の世話をすると信じているマルチスレッドのためにNSOperationQueueを使用しています..もし私が他のスレッドで直接NSThreadを使用していたら、その特定のスレッドのための自動解放プールを作成しなければならなかった..右..?私が間違っている場合私を修正してください。 –

+0

この関数にNSAutoreleasePoolをラップし、問題が修正されているかどうかを調べることができます。 AutoreleasePoolリークは、通常、バックグラウンドでメソッドを実行しようとするときに発生します。これは、AutoreleasePoolがありません。 –

+0

はい、操作メインに自動解放プールを作成する必要があります。 Markのコメントについては、http://stackoverflow.com/questions/184409/nsautoreleasepool-in-nsoperation-main – par

関連する問題