使用 SDWebImage 下载大图像时应用程序崩溃?
App crash while downloading large images using SDWebImage?
我正在使用 SDWebImage
从服务器上的 server.Some 异步下载图像大小约为 1.5 到 2。MB.I 在 [=13= 上显示这些图像].几次 run.Some 次后,我收到内存警告和应用程序崩溃,这是在第一次下载图像时发生的,有时是在我上下滚动集合视图时发生的。
这是我的代码-
-(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 产生内存 warning.Any 帮助或建议将不胜感激。
编辑:- 我的应用程序由于内存压力而被终止,但仅限于 iPhone 4s 和更低版本(在 iPhone5 及更高版本上工作正常)。正在下载大图像(或完整下载)我突然出现内存峰值(从 ~25mb 到 ~90mb)和应用 crashes.Any 建议做什么?
听起来您的应用程序由于内存压力而被终止。检查 Instruments where exactly the memory increases and maybe try using an Autorelease Pool 以减轻任何内存峰值。
是的,@dlinsin 完全正确。这绝对是内存问题。
希望您没有使用同一张 2mb 的图片作为缩略图。如果是,那就是你崩溃的原因。请使用较低分辨率的图像作为缩略图,并在用户要求时显示较大的图像
顺便说一句,用这个看看是否有帮助。
[[SDImageCache sharedImageCache] setShouldDecompressImages:NO];
[[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];
我正在使用 SDWebImage
从服务器上的 server.Some 异步下载图像大小约为 1.5 到 2。MB.I 在 [=13= 上显示这些图像].几次 run.Some 次后,我收到内存警告和应用程序崩溃,这是在第一次下载图像时发生的,有时是在我上下滚动集合视图时发生的。
这是我的代码-
-(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 产生内存 warning.Any 帮助或建议将不胜感激。 编辑:- 我的应用程序由于内存压力而被终止,但仅限于 iPhone 4s 和更低版本(在 iPhone5 及更高版本上工作正常)。正在下载大图像(或完整下载)我突然出现内存峰值(从 ~25mb 到 ~90mb)和应用 crashes.Any 建议做什么?
听起来您的应用程序由于内存压力而被终止。检查 Instruments where exactly the memory increases and maybe try using an Autorelease Pool 以减轻任何内存峰值。
是的,@dlinsin 完全正确。这绝对是内存问题。
希望您没有使用同一张 2mb 的图片作为缩略图。如果是,那就是你崩溃的原因。请使用较低分辨率的图像作为缩略图,并在用户要求时显示较大的图像
顺便说一句,用这个看看是否有帮助。
[[SDImageCache sharedImageCache] setShouldDecompressImages:NO]; [[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];