使用SDWebImage下载大图像时应用程序崩溃?

时间:2015-01-05 13:22:54

标签: ios objective-c memory-management sdwebimage

我使用SDWebImage从服务器下载图像异步。服务器上的一些图像大小约为1.5到2. MB.I&#m;我在UICollectionView上显示这些图像。我在几次运行后得到了内存警告和应用程序崩溃。有时它会在第一次下载图像时出现,有时会在我上下滚动集合视图时发生。 这是我的代码 -

-(void)setImageWithUrl:(NSURL*)imgurl onImageView:(UIImageView*)image prograssive:(BOOL)progressive
{
    __block UIActivityIndicatorView *activityIndicator;
    __weak UIImageView *weakImageView = image;
    SDWebImageOptions opt;
    if (progressive) {

        opt = SDWebImageProgressiveDownload;
    }
    else
        opt = SDWebImageRetryFailed;
    [image sd_setImageWithURL:imgurl placeholderImage:[UIImage imageNamed:@"default_image"] options:opt progress:^(NSInteger receivedSize, NSInteger expectedSize)
     {
         if (!activityIndicator)
         {
             [weakImageView addSubview:activityIndicator = [UIActivityIndicatorView.alloc initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]];
             activityIndicator.center = CGPointMake(weakImageView.frame.size.width /2, weakImageView.frame.size.height/2);
             // activityIndicator.center = weakImageView.center;
             [activityIndicator setBackgroundColor:[UIColor clearColor]];
             [activityIndicator startAnimating];
         }
     }
                    completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)
     {
         [activityIndicator removeFromSuperview];
         activityIndicator = nil;
     }];
}

并在AppDelegate -

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{

    [[SDImageCache sharedImageCache] clearMemory];
    [[SDImageCache sharedImageCache] cleanDisk];
    [[SDImageCache sharedImageCache] clearDisk];
    [[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
}

请不要图像是高分辨率(超过3000像素宽度)。例如其中一个有4256 * 2832和979KB大小产生内存警告。任何帮助或建议将不胜感激。 编辑: - 我的应用程序因内存压力而被杀,但仅限iPhone 4s及更低版本(在iPhone5及以上版本正常工作)。当下载大图像(或完整下载)时得到突然的内存峰值(它从〜约25mb到~90mb)和应用程序崩溃。任何建议怎么做?

2 个答案:

答案 0 :(得分:3)

听起来你的应用程序因内存压力而被杀死。检查Instruments内存增加的确切位置,并尝试使用Autorelease Pool来缓解内存峰值。

答案 1 :(得分:2)

是的,@ dlinsin是绝对正确的。这绝对是记忆问题。

我希望你没有使用相同的2mb图像作为缩略图。如果是,那就是你崩溃的原因。请将较低分辨率的图像用作拇指,并在用户要求时显示较大的图像

顺便说一下,用它来看看是否有任何帮助。

[[SDImageCache sharedImageCache] setShouldDecompressImages:NO]; [[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];