iOS 开发中加载网络图片最常使用的框架是
SDWebImage、FLAnimatedImage、YYKit、AFNetworking等,虽然这些都是很成熟的框架,但是在具体的使用过程中,会遇到一些意想不到的问题,下面就来简单介绍一下我的使用经验。
加载大量图片
- 当页面需要加载大量的图片的时候,使用
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];
方案三:
使用 tableview、collectionView滑动的时候,也会有图片过多导致内存暴增的情况,这时候做如下处理:
在 -(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]];
以上是粗浅的经验,具体崩溃的原因,还需要研究源码得到进一步的解释,如果有遇到以上问题的可以简单处理一下,有时间了再深究。
参考资料: