изображение iphone протекает, но где? - PullRequest
2 голосов
/ 24 апреля 2010

изображение, которое отображается в этом коде, протекает, но я не могу понять, как. Что у меня есть табличное представление, которое отображает изображения для отображения. Каждый раз, когда пользователь выбирает изображение, он должен удалить старое изображение, загрузить новое, а затем добавить его в представление прокрутки. Но старое изображение не выпускается, и я не могу понять, почему ...

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

Ответы [ 2 ]

7 голосов
/ 24 апреля 2010

Это выглядит неправильно:

self.imageView = nil;
[imageView removeFromSuperview];

Вы устанавливаете imageView в nil перед удалением его из суперпредставления, поэтому второе утверждение на самом деле просто [nil removeFromSuperview];, которое ничего не собирается делать.

3 голосов
/ 24 апреля 2010

Я думаю, что утечка - это то, что сказал Дэвид Гелхар, но я просто хотел добавить, что вы не должны получать доступ к пользовательскому интерфейсу из потоков, отличных от основного потока (так, например, не делайте [imageView removeFromSuperview] в отдельном потоке ). Это может вызвать очень странные проблемы, в том числе таинственные утечки. Попробуйте поместить все эти вещи в отдельный метод в главном потоке, который вы вызываете с помощью [self performSelectorOnMainThread:], и посмотрите, все ли еще есть утечки.

Также (хотя это не приведет к утечке), [pool drain] освобождает пул автоматического выпуска, поэтому не следует вызывать [pool release] после него - это может освободить пул в главном потоке, что может привести к сбою где-то вниз по линии (так как вы можете перевыпустить пул).

...