【问题标题】:iphone image is leaking, but where?iphone图像泄漏,但在哪里?
【发布时间】:2010-04-24 01:32:18
【问题描述】:

此代码中显示的图像泄漏,但我不知道如何。我有一个显示要显示的图像的表格视图。每次用户选择图像时,它应该删除旧图像,下载新图像,然后将其添加到滚动视图。但是旧图没有发布,我不知道为什么......

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

【问题讨论】:

    标签: iphone objective-c memory-leaks uiimageview


    【解决方案1】:

    这看起来不对:

    self.imageView = nil;
    [imageView removeFromSuperview];
    

    您将imageView 设置为nil 从超级视图中删除它之前,所以第二条语句实际上只是[nil removeFromSuperview];,它不会做任何事情。

    【讨论】:

    • +1 因为这是正确的答案。大卫·格哈尔? BlitzMail 的家伙?
    【解决方案2】:

    我认为泄漏是 David Gelhar 所说的,但我只是想补充一点,您不应该从主线程以外的线程访问 UI 内容(例如,不要在单独的线程下执行 [imageView removeFromSuperview] )。这可能会导致非常奇怪的问题,包括神秘的泄漏。尝试将所有这些东西放在你用[self performSelectorOnMainThread:] 调用的主线程上的一个单独的方法中,看看它是否仍然泄漏。

    另外(虽然这不会导致泄漏),[pool drain] 释放自动释放池,所以你不应该在它之后调用[pool release]——它可能会释放主线程上的池,可能导致崩溃某处下线(因为你可以过度释放池)。

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多