2010-04-24 87 views
2

在此代碼中顯示的圖像泄漏,但我無法弄清楚如何。我有一個桌面顯示圖像顯示。用戶每次選擇圖像時,都應刪除舊圖像,下載新圖像,然後將其添加到滾動視圖中。但舊的圖像沒有被釋放,我無法弄清楚,爲什麼...iphone圖像泄漏,但在哪裏?

-(void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [imageView removeFromSuperview]; 
    self.imageView = nil; 
    NSUInteger row = [indexPath row]; 

    NSString *tempC = [[NSString alloc]initWithFormat:@"http://www.website.com/%@_0001.jpg",[pdfNamesFinalArray objectAtIndex:row] ]; 
    chartFileName = tempC; 
    pdfName = [pdfNamesFinalArray objectAtIndex:row]; 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, YES); 
    NSString *docsPath = [paths objectAtIndex:0]; 
    NSString *tempString = [[[NSString alloc]initWithFormat:@"%@/%@.jpg",docsPath,pdfName]autorelease]; 
    NSData *data = [NSData dataWithContentsOfFile:tempString]; 

    if (data != NULL){ 
     self.imageView = nil; 
     [imageView removeFromSuperview]; 
     self.imageView = nil; 
     UIImageView *tempImage = [[[UIImageView alloc]initWithImage:[UIImage imageWithData:data]]autorelease]; 
     self.imageView = tempImage; 
     [data release]; 
     scrollView.contentSize = CGSizeMake(imageView.frame.size.width , imageView.frame.size.height); 
     scrollView.maximumZoomScale = 1; 
     scrollView.minimumZoomScale = .6; 

     scrollView.clipsToBounds = YES; 
     scrollView.delegate = self; 

     [scrollView addSubview:imageView]; 
     scrollView.zoomScale = .37; 

    } 

    else { 
     [data release]; 
     self.imageView = nil; 
     [imageView removeFromSuperview]; 
     self.imageView = nil; 
     activityIndicator.hidden = NO; 
     getChartsButton.enabled = NO; 
     chartListButton.enabled = NO; 
     saveChartButton.enabled = NO; 
     [NSThread detachNewThreadSelector:@selector(downloadImages) toTarget:self withObject:nil]; 



    } 
chartPanel.hidden = YES; 



} 

-(void) downloadImages { 

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    self.imageView = nil; 
    [imageView removeFromSuperview]; 
    NSURL *url = [[[NSURL alloc]initWithString:chartFileName]autorelease]; 
    NSData *data = [NSData dataWithContentsOfURL:url]; 

    UIImageView *tempImage = [[[UIImageView alloc]initWithImage:[UIImage imageWithData:data]]autorelease]; 
    self.imageView = tempImage; 
    tempImage = nil; 

    scrollView.contentSize = CGSizeMake(imageView.frame.size.width , imageView.frame.size.height); 
    scrollView.maximumZoomScale = 1; 
    scrollView.minimumZoomScale = .37; 
    scrollView.clipsToBounds = YES; 
    scrollView.delegate = self; 
    [scrollView addSubview:imageView]; 
    scrollView.zoomScale = .6; 

    activityIndicator.hidden = YES; 
    getChartsButton.enabled = YES; 
    chartListButton.enabled = YES; 
    saveChartButton.enabled = YES; 
    [pool drain]; 
    [pool release]; 
} 

回答

7

這看起來錯:

self.imageView = nil; 
[imageView removeFromSuperview]; 

要設置imageView到零之前,從上海華刪除它,所以第二個陳述真的只是[nil removeFromSuperview];,這是不會做任何事情。

+0

+1因爲這是正確的答案。大衛Gelhar? BlitzMail的傢伙? – 2010-04-24 02:52:35

3

我認爲泄漏是David Gelhar說的,但我只是想補充說,你不應該從主線程以外的線程訪問UI的東西(例如,不要在單獨的線程下執行[imageView removeFromSuperview]) 。這可能導致非常奇怪的問題,包括神祕的泄漏。嘗試將所有這些東西放在主線程上的一個單獨的方法中,然後通過[self performSelectorOnMainThread:]調用並查看它是否仍然泄漏。

另外(雖然這不會導致泄漏),但是[pool drain]會釋放自動釋放池,所以在它之後不應該調用[pool release]--它可能會釋放主線程上的池,可能會導致崩潰行(因爲你可以過度釋放池)。