繁体   English   中英

使用SDWebImage加载大gif导致iOS应用崩溃并出现内存错误

[英]Loading a big gif with SDWebImage caused iOS app crash with memory error

我正在使用SDWebImage框架从UIScrollView上的UIImageView从互联网返回的URL获取全屏图像,如下所示:

[imageView sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"placeholder"] options:SDWebImageCacheMemoryOnly completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
    if (!error) {
        //added as subview
    } else {
        //show error
    }
}];

当图像的格式为jpgpng ,它可以很好地显示,甚至是一些正常大小的gif 但是当有一个大gif ,它将导致崩溃,并且XCode给出了这样的错误:

Message from debugger: Terminated due to Memory Error

更新:每次都会导致崩溃的gif图像为299px * 299px570KB大。 对于那些有兴趣查看gif的人,链接是:

http://ww4.sinaimg.cn/large/604e48d0jw1evcn03adjjg208b08bdv0.gif

每次单击预览缩略图时,我都可以重新创建它。 我该如何解决? 使用什么工具观察根本原因? 我进行了一些研究,我想这是否是由于我使用了以下选项导致的: SDWebImageCacheMemoryOnly ,而大gif占用了我应用程序的大部分内存,因此崩溃了。 谢谢。

我注意到有关动画gif图像的事情是,它是一个非常长的(就帧数而言)动画-3191帧。 这些帧中的每一帧都是300x300,总像素接近3 亿 而且我们必须一次将所有这些像素保存在内存中:没有其他方法可以快速显示帧。 而且它似乎被编码为RGB,因此每个像素为4个字节。 如果我是对的,那么显示这个东西所需的内存就超过了GB。 这当然就是Graphic Converter的建议:

在此处输入图片说明

所以您是对的,我完全可以想象显示出来的内容可能很麻烦。 我的建议是:不。

SDWebImage具有自己的GIF支持实现。 问题在于,他们会反复考虑所有框架并预先创建位图:

for (size_t i = 0; i < count; i++) {
    CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
    duration += [self sd_frameDurationAtIndex:i source:source];
    [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];
    CGImageRelease(image);
}

另一方面,FLAnimatedImage可按需创建位图并智能地对其进行缓存。

看看FLAnimatedImage 以及使用它进行GIF播放的图像加载器,例如Nuke (我的), PNRemoteImage ,FLAnimatedImage_AFNetworking等。或者直接使用FLAnimatedImage。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM