UITableViewCell内存问题中的异步图像加载

时间:2013-01-04 05:55:50

标签: ios asynchronous uitableview uiimageview

在我的iPhone应用程序中,我有一个带有自定义imageview的tableview,并使用AsyncImageView类从远程位置加载图像。它工作得很好,但有一个问题是,如果我滚动表格,单元格将出列,并再次尝试从服务器获取图像。因此,从AsyncImageView类加载图像的方法是一次又一次地调用因此增加了内存分配,最终应用程序崩溃。

这是我的代码:

- (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier {

    CGRect CellFrame = CGRectMake(0, 0, 300, 40);

    CGRect userImageFrame = CGRectMake(5, 7, 36, 36);

    UIImageView *userImage;

    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    [cell setFrame:CellFrame];

    userImage = [[UIImageView alloc]init];
    userImage.frame = userImageFrame;
    userImage.tag = 3;
    [cell.contentView addSubview:userImage];
    [userImage release];

    return cell;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
        cell = [self getCellContentView:CellIdentifier];
    else
        [[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:cell.imageView];

    UIImageView *userImage = (UIImageView *)[cell viewWithTag:3];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.selectionStyle = UITableViewCellSelectionStyleGray;
    NSString *url = [[NSString alloc]initWithFormat:@"%@%@", CommonImageURL,[AllUsersProfileImageArray objectAtIndex:indexPath.row]];
    NSURL *imageUrl =  [NSURL URLWithString:[url stringByAppendingFormat:@"?%i", rand()]];
    [url release];

    userImage.image = [UIImage imageNamed:@"defaultPerson.png"];
    userImage.imageURL = imageUrl;
    return cell;
}

有没有办法解决这个问题?请帮忙。

4 个答案:

答案 0 :(得分:2)

最佳解决方案是缓存已下载的图像并从那里显示它。

您需要为此编写代码,或者有一些库提供此类功能:

  1. HJCache
  2. SDWebImage

答案 1 :(得分:1)

流行的AFNetworking库还包含一个UIImageView类别,用于从Web上加载经常被忽略的图像。我发现它在内存使用方面非常高效且易于使用。

http://afnetworking.github.com/AFNetworking/Categories/UIImageView+AFNetworking.html

答案 2 :(得分:0)

我遇到了从服务器加载多个图像的内存泄漏问题。我的应用程序每次都需要新的图像响应(功能因素)
我使用异步请求使用NSURLConnection。我试过

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:0];
[NSURLCache setSharedURLCache:sharedCache]; // in DidFinishLoading & didFailWithError

receivedData=nil;  // at didReceiveResponse
receivedData=[[NSMutableData alloc] init];

但没有任何帮助,直到我移除了我的牢房  在cellForRowAtIndexPath中[cell removeFromSuperview];并再次初始化它每个新的 NSURL请求(如果在cellForRowAtIndexPath上有条件,但实际上已付清)。

可能UIImageViews从未被移除,并且新的图像n数据被不断添加为响应提取。删除旧的UITableViewCell用于新的NSURLRequest工作在我的情况下。
希望这有助于像我这样的人在清理NSURLCache并且记忆力增强时失去了。

答案 3 :(得分:0)

我在这里发布了一个自定义解决方案 Download image asynchronously

我认为它工作正常,只需要很少的代码。