在我的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;
}
有没有办法解决这个问题?请帮忙。
答案 0 :(得分:2)
答案 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。
我认为它工作正常,只需要很少的代码。