マルチスレッドiPhoneアプリケーションでメモリ管理関連の質問があります。 それがメインUIスレッドとは別のスレッドで呼び出され、我々はこの方法を持っているとしましょう:あなたが見ることができるように[NSAutoreleasePool release]でマルチスレッドiPhoneアプリがクラッシュする
- (BOOL)fetchAtIndex:(NSUInteger)index
{
NSURL *theURL = [NSURL URLWithString:[queryURLs objectAtIndex:index]];
// Pay attention to this line:
NSData *theData = [[NetworkHelper fetchFromNetwork:theURL] retain];
// Some code here...
// Now what should I do before returning result?
//[theData release]; ??
//[theData autorelease]; ??
return YES;
}
、私は戻って私のネットワーク運用から得たNSData
を保持しています。問題は、なぜ私はメソッドの最後にそれをリリース(または自動解放)してはいけないのですか? 私がそれを働かせた唯一の方法は、最初にretain
を使用し、何もしないことです。私がスレッドのNSAutoreleasePool
をリリースしたときに私が他の組み合わせを使用した場合(retain
、次にrelease
またはautorelease
)、私のプログラムはEXC_BAD_ACCESS
でクラッシュします。 私は何が欠けていますか?
FYI、ここのスレッドの主なコードは次のとおりです。あなたの助けのための
- (void)threadedDataFetching;
{
// Create an autorelease pool for this thread
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Reload data in separate thread
[self fetchAtIndex:0];
// Signal the main thread that fetching is finished
[self performSelectorOnMainThread:@selector(finishedFetchingAll) withObject:nil waitUntilDone:NO];
// Release all objects in the autorelease pool
[pool release]; // This line causes EXC_BAD_ACCESS
}
ありがとう!
ありがとうございます。 実際、fetchFromNetworkは2番目のコードサンプルのようでした。 NSData * data = [otherObject dataFromOtherObject]; ... 返品[データ自動取り消し]; //ここで間違っている! 私はそれをクライアントコードに保持しなければならなかったのです。 誤った-autorelease呼び出しを削除してから、クライアント側で-retainコードを削除しましたが、今はすべて問題ありません。 ありがとう! – Romain