2010-12-06 6 views
2

私はスレッドを使用しながら、リークを処理する方法を iPhoneで複数のスレッドを使用している場合のリークを処理する方法は?

[NSThread detachNewThreadSelector:@selector(callWebService) toTarget:self withObject:nil]; 

-(void)callWebService{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
[NSThread detachNewThreadSelector:@selector(loadImages) toTarget:self withObject:nil]; 
[pool release]; 
    } 
-(void)loadImages{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [self performSelectorOnMainThread:@selector(reloadTable) withObject:nil waitUntilDone:false]; 
[pool release]; 
} 
-(void)reloadTable 
    { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

[myTableView reloadData]; 
[pool release]; 

} 

viewDidLoadメソッドに別のスレッドで呼ばれる方法がありますか?私はスレッドを使いたい。

エラー

*** __NSAutoreleaseNoPool(): Object 0x604b830 of class NSCFString autoreleased with no pool in place - just leaking 

*** -[NSAutoreleasePool release]: This pool has already been drained, do not release it (double release). 

答えて

0

は、自動解放プールはdrain、ないreleaseでなければなりません。だから私はあなたが[pool drain]に変更すればそれはうまくいくはずだと思います。

+0

まだ同じ問題が残っています – Warrior

0

あなたの答えがまだ分かっていないか分かりませんが、あなたの問題に似たようなものをヒットしたので、私は見ました。あなたがプールを排水すると、それを解放することに(効果的に)同等であるようです。クラスのドキュメントは言う:あなたは自動解放プールを保持することはできませんので、プールが最終的にそれを割り当て解除 の効果を持つ排水、(または自動解放 を保持し、自動解放を-参照)

だから、プールは一度排水してください。その時点以降に別のコンテキストが必要な場合は、コード内で以前に生成したのと同じ方法で新しいプールを生成する必要があります。

利用可能なプールがない場合は、(前述のように)リークする可能性があります。ただし、自動解放呼び出しは、そのインスタンスに警告メッセージを記録する必要があります。スレッドについて、ドキュメントが、これはアプリケーションキットは、イベントループの各サイクルごとの 初めに、メインスレッド上で自動解放プールを作成し、 最後にそれを排出することにより、任意の自動解放を解放

を言っていますオブジェクトは イベントを処理中に生成されます。アプリケーションキットを使用している場合は、 は通常、独自のプールを作成する必要はありません。アプリケーション がイベントループ内に多数の一時的な自動解放オブジェクトを作成する場合は、 を作成すると、ピークメモリフットプリントを最小限に抑えるために に "ローカル"自動解放プールを作成すると効果的です。

これが役に立ちます。

関連する問題