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 内存不足问题的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio的JVM内存不足问题怎么解决

虚拟机显示物理内存不足怎么解决

JAVA软件运行时,内存不足

电脑开机一会就出现内存不足,是啥原因

缓解CLion因内存不足卡顿的问题

怎么解决内存不足?