AFNetworking 内存不足问题
Posted
技术标签:
【中文标题】AFNetworking 内存不足问题【英文标题】:AFNetworking low memory issue 【发布时间】:2014-12-24 12:48:40 【问题描述】:我使用此代码下载图像:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
SECustomCollectionViewCell *collectionViewCell = (SECustomCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"SECustomCollectionViewCell" forIndexPath:indexPath];
NSDictionary *artwork = [self.artworks objectAtIndex:indexPath.item];
collectionViewCell.theImageView.image = nil;
if (artwork[@"video_url"])
UIWebView *webView = (UIWebView *)[collectionViewCell.contentView viewWithTag:100];
NSString * html = [self embedYouTube:artwork[@"video_url"] frame:collectionViewCell.frame];
[webView setHidden:NO];
[webView loadHTMLString:html baseURL:nil];
[collectionViewCell.activityIndicator setHidden:YES];
else
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:artwork[@"image_url"]]];
UIImage *cachedImage = [[[UIImageView class] sharedImageCache] cachedImageForRequest:request];
if (cachedImage)
collectionViewCell.theImageView.image = [UIImage scaleImage:cachedImage toWidth:collectionViewCell.frame.size.width];
[collectionViewCell.activityIndicator setHidden:YES];
else
[collectionViewCell.theImageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
// Only update visible cell, to avoid inserting image to another cell.
SECustomCollectionViewCell *visibleCollectionViewCell = (id)[collectionView cellForItemAtIndexPath:indexPath];
if (visibleCollectionViewCell)
[visibleCollectionViewCell.theImageView setImage:[UIImage scaleImage:image toWidth:collectionViewCell.frame.size.width]];
[visibleCollectionViewCell.activityIndicator stopAnimating];
[visibleCollectionViewCell.activityIndicator setHidden:YES];
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
];
return collectionViewCell;
但它会导致内存不足的问题。
【问题讨论】:
文件有多大?大型文件最好通过直接流式传输到文件来下载。主线程上进行了大量计算,包括图像缩放。 @Zaph 我在服务器上有 1.4MB 的 jpeg 文件,但 XCode 说在加载到 imageview 后有 70MB 所以不是 AFNetworking 而是图像代码导致了内存使用。图片有多大? JPEG 或 PNG 等压缩图像,但创建图像时,每个像素将有 4 个字节。正在进行缩放,这也将使用内存。您可能应该在缩放方法周围放置自动释放池,以便尽早释放内存。 @Zaph 它是 5407 × 3605,但是在我下载它之后,我尝试调整它的大小并设置图像视图新的更小的图像。但我认为 afnetworking 加载的数据仍然很大。当集合视图尝试上传 10 张图片时,数量很大。我同意,但我该如何处理。我的意思是,也许我需要等待一张图片上传,然后调整它的大小。上传第一张图片并调整其大小后,应用程序应该向前移动并上传第二张图片,并对第一张图片和下一张图片执行相同操作? 【参考方案1】:导致内存使用的不是 AFNetworking,而是图像代码。 JPEG 压缩图像,但创建图像时,每个像素将有 4 个字节。由于服务器上 1.4MB 的 jpeg 文件将加载所有 AFNetworking。
您似乎正在使用一些帮助类查看该代码和 NSLog AFNetworking 下载的实际数据的大小。
一个 5407 × 3605 的图像,每像素 4 字节将创建一个超过 77MB 的图像。您可以对其进行缩放,但首先会渲染原始图像,并且缩放将使用更多内存,因为最后您将拥有两个图像。
您需要将原始图像的创建和缩放包装在一个自动释放池中,以便尽快释放原始图像。
最好一开始就不要加载这么大的图片。
【讨论】:
以上是关于AFNetworking 内存不足问题的主要内容,如果未能解决你的问题,请参考以下文章