我有一個多線程的iPhone應用程序中與內存管理相關的問題。 比方說,我們有這樣的方法,即所謂的在比主UI線程的一個單獨的線程:多線程iPhone應用程序崩潰與[NSAutoreleasePool發佈]
- (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
然後release
或autorelease
),當我釋放線程的NSAutoreleasePool
時,我的程序崩潰EXC_BAD_ACCESS
。 我錯過了什麼?
僅供參考,這裏是線程的主要代碼:
- (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就像你的第二個代碼示例: NSData * data = [otherObject dataFromOtherObject]; ... return [data autorelease]; //錯了! 這就是爲什麼我必須保留在我的客戶端代碼。 我刪除了錯誤的-autorelease調用,然後在客戶端的--retain代碼,現在一切都很好。 謝謝! – Romain 2009-07-27 20:59:27