iOS 图片处理及常见问题解决

1,712 阅读2分钟

iOS 开发中加载网络图片最常使用的框架是 SDWebImageFLAnimatedImageYYKitAFNetworking 等,虽然这些都是很成熟的框架,但是在具体的使用过程中,会遇到一些意想不到的问题,下面就来简单介绍一下我的使用经验。

加载大量图片
  • 当页面需要加载大量的图片的时候,使用 SDWebImage ,可能会发生崩溃,打印信息如下:
CGBitmapContextInfoCreate: unable to allocate 1008000 bytes for bitmap data
[Unknown process name] CGTypeCreateInstance: failed to create instance of type 281.
[Unknown process name] CGSImageDataLock: Cannot allocate memory

方案一:

这时候更换 AFNetworking 就可以了,如下所示:

[imageView sd_setImageWithURL:[NSURL URLWithString:@"img"] placeholderImage:[UIImage imageNamed:@"default"]];

替换为:

[imageView setImageWithURL:[NSURL URLWithString:@"img"] placeholder:[UIImage imageNamed:@"default"]];

方案二:

SDWebImage 在解压缩图片的时候会消耗大量的内存,禁止解压缩会大幅度降低崩溃的情况。

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

这个属性设置是全局性的,也就是在正常加载的情况下,可将属性更改为

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

方案三:

使用 tableviewcollectionView滑动的时候,也会有图片过多导致内存暴增的情况,这时候做如下处理:

-(void)scrollViewDidScroll:(UIScrollView*)scrollView方法里面添加[[SDImageCache sharedImageCache] clearMemory],这样内存也会减少很多。

加载 Gif 动图
  • 加载动态 gif 图片的时候,使用 YYAnimatedImageView 也会发生崩溃,这时候使用 FLAnimatedImageView 也就可以了。
YYAnimatedImageView *imgView = [[YYAnimatedImageView alloc] init];
imgView.image = [YYImage imageNamed:@"xx.gif"];

替换为:

NSURL *imgUrl = [[NSBundle mainBundle] URLForResource:@"xx" withExtension:@"gif"];
FLAnimatedImageView *imgView = [[FLAnimatedImageView alloc] init];
imgView.animatedImage = [FLAnimatedImage animatedImageWithGIFData:[NSData dataWithContentsOfURL:imgUrl]];

以上是粗浅的经验,具体崩溃的原因,还需要研究源码得到进一步的解释,如果有遇到以上问题的可以简单处理一下,有时间了再深究。

参考资料:

1、SDWebImage原理

2、SDWebImage从小白到大师蜕变