マルチスレッドのiPhoneアプリケーションでメモリ管理に関連する質問があります。main-UIスレッドとは別のスレッドで呼び出されるこのメソッドがあるとしましょう。
- (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
、最初は使用することであり、その後は何も使用しません。他の組み合わせを使用すると(何もしない; retain
thenrelease
または)、スレッドを解放するautorelease
とプログラムがクラッシュします。私は何が欠けていますか?EXC_BAD_ACCESS
NSAutoreleasePool
参考までに、スレッドのメインコードは次のとおりです。
- (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
}
ご協力いただきありがとうございます!