2010-04-24 2 views
2

l'image qui est affichée dans ce code fuit mais je ne peux pas comprendre comment. Ce que j'ai une tableview qui affiche des images à afficher. Chaque fois qu'un utilisateur sélectionne une image, il doit supprimer l'ancienne image, en télécharger une nouvelle, puis l'ajouter à la vue déroulante. Mais l'ancienne image n'est pas sorti et je ne peux pas comprendre pourquoi ...l'image de l'iPhone fuit, mais où?

-(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]; 
} 

Répondre

7

Cela semble mal:

self.imageView = nil; 
[imageView removeFromSuperview]; 

Vous définissez imageView à zéro avant retirer du superview, donc la 2ème déclaration est vraiment juste [nil removeFromSuperview];, ce qui ne va rien faire.

+0

+1 parce que c'est la bonne réponse. David Gelhar? Le gars de BlitzMail? –

3

Je pense que la fuite est ce que David Gelhar a dit, mais je voulais juste ajouter que vous ne devriez pas accéder à l'interface utilisateur à partir de threads autres que le thread principal (par exemple, ne pas [imageView removeFromSuperview] sous un thread séparé) . Cela peut causer des problèmes très étranges, y compris des fuites mystérieuses. Essayez de mettre tous ces éléments dans une méthode séparée sur le thread principal que vous appelez avec [self performSelectorOnMainThread:] et voir si elle fuit toujours. En outre (bien que cela ne provoque pas la fuite), [pool drain] libère le pool autorelease, donc vous ne devriez pas appeler [pool release] après cela - il pourrait libérer le pool sur le thread principal, pouvant causer un crash quelque part dans le ligne (puisque vous pourriez trop relâcher la piscine).

Questions connexes