业务描述:一款摄影师app, 需要上传大量的图片到OSS上面,将10M-20M的原片压缩到1-2M之后,然后一次性选择500张1-2M的图片上传到OSS上面。
问题描述: 选择了大量高质量图片之后,会导致内存瞬间暴增,最终导致APP闪退。
解决思路:从相册选取照片的时候,将10-20M的图片压缩到100KB左右的照片,显示在collectionView上面,因为这样选择的是缩略图,所以不会导致内存暴增,可以将几百张图片顺利展示在collectionView上。
然后,在图片上传的时候,将10M-20M的原片压缩到1-2M之后上传,上传了4-5张图片之后,就会出现app闪退,后面找出原因是因为 [putTask waitUntilFinished] 阻塞了线程,如果注释掉这句代码可以将几百上图片上传,但是中途会导致某些照片实际上面没有上传。
问题追加:
去掉putTask waitUntilFinished] 不行,会导致大量的图片上传不成功。
我反复测试发现,这个问题的根源在于内存里面加载了大量的高质量图片,导致占用的内存暴增,最终会因为内存不够,导致app闪退。
我感觉解决的办法应该是要释放一些内存,占内存的是图片,但是又不得不加载这些图片,而且还要保证图片的质量。
求大神指导,当图片占用了大量内存?如何解决?
已经尝试过@autoreleasepool,对于数量在300张以下有效果,当图片数量达到500张以下,依然会内存暴增。
- (void)thread1GetData:(NSArray *)array
{
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.synchronous = YES;
for (int i = 0; i <[array count]; i ++) {
@autoreleasepool{
PHAsset *asset = array[i];
NSString *imgName = [asset valueForKey:@"filename"];
NSLog(@"filename:%@",imgName);
CGSize size = CGSizeMake(asset.pixelWidth, asset.pixelHeight);
// 从asset中获得图片
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
UIImage *resultImg = [result scaledCopyOfSizeMin:CGSizeMake(1300, 1300)]; //压缩图片
[self.dataArr addObject:resultImg];
result = nil;
info = nil;
}];
}
}
}