1

在我的 iPhone 应用程序中,我有一个带有自定义图像视图的表格视图,并使用 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

4 回答 4

2

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

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

  1. HJCache
  2. SDWebImage
于 2013-01-04T06:00:34.657 回答
1

流行的AFNetworking库还包括一个 UIImageView 类别,用于从网络加载图像,这经常被忽视。我发现它在内存使用方面非常有效并且易于使用。

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

于 2013-01-04T07:21:29.570 回答
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 数据。在我的情况下,为新的 NSURLRequest 删除旧的 UITableViewCell 是可行的。
  希望这可以帮助像我这样迷失在清理 NSURLCache 并且仍在增加内存的人。

于 2014-02-25T17:48:04.107 回答
0

我在这里发布了一个自定义解决方案 异步下载图像

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

于 2014-03-06T09:55:48.217 回答