2011-01-19 55 views
0

我知道這一定是簡單的東西,我俯瞰,但爲什麼這泄漏:NSAutoreleasePool泄漏

//add a pool for this since it is on its own thread 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

//add the image 
NSURL * imageURL = [NSURL URLWithString:[recipeData objectForKey:@"imagePath"]]; 
NSData * imageData = [NSData dataWithContentsOfURL:imageURL]; 
UIImage * image = [UIImage imageWithData:imageData]; 
UIImageView * myImageView = [[UIImageView alloc] initWithImage:image]; 

//resize to make it fit the screen space 
CGRect frame = myImageView.frame; 
frame.size.width = 320; 
frame.size.height = 357; 
myImageView.frame = frame; 

[self.view addSubview:myImageView]; 


[activity stopAnimating]; 

[pool drain]; 
[self placeItems]; 

我得到的錯誤:

_NSAutoreleaseNoPool():對象0x4e2fdf0類NSPathStore2自動釋放與沒有到位的地方 - 只是漏水

我試着移動[pool drain]的位置,但是什麼也沒做。在Google搜索某個原因時,我看到很多代碼看起來就像這樣。

感謝您的幫助。

+1

您正在泄漏`myImageView`(它需要被釋放)。除此之外,乍一看,一切都很好。 – kubi 2011-01-19 15:44:38

回答

2

排空池會釋放並隨後釋放它,因爲autoreleasepools不能保留。我懷疑在placeItems(或其他一些地方叫做[pool drain]之後)中必須有一些autoreleasepool需要,因爲在那個時候池已經可用了。

因此,您可能需要嘗試評論排水消息,看看是否會導致泄漏消失。

+0

修復了它。我只是得到一個警告「未使用的變量池」 – 2011-01-19 16:05:59

2

很多事情要在這裏說:

  • 第一,你漏myImageView。你必須在-addSubview之後釋放它。
  • 接下來,由於您在另一個線程中,因爲您不在主線程中,所以您無法執行任何UI操作,因爲您的[pool pool]必須位於末尾
  • 。嘗試用[self.view performSelectorOnMainThread:@selector(addSubview:) withObject:myImageView waitUntilDone:YES]替換[self.view addSubview:myImageView]。同[activity stopAnimating]

而且像Brian說的那樣,-drain消息必須在您的線程結束。