关于UIImageJPEGRepresentation 内存的问题

本文介绍了一种在iOS应用中解决大量图片上传导致APP崩溃的方法。通过将待上传图片保存至本地,在上传成功后再加载至内存显示的方式,有效避免了因内存占用过高而引发的崩溃现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做一个项目,使用到了要上传N个人信息到服务端,每个个人信息都有四张图,当人数增加到5个的时候,上传图片app 就会爆掉。仔细debug发现,使用UIImageJPEGRepresentation 把image转化成data的时候,如果image对象不销毁,内存就会一直增加,数量到了app就会crash掉。

我相信也有很多人遇到了这样的问题,我是这样解决的,把要传的图片保存到本地,上传到了服务端之后,再把这个图片读取到内存中显示出来。这样上传几十张也不会crash。
如果有更好的方法,请一起讨论。
NSURLSessionTask *sessionTask = [_sessionManager POST:URL parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { for (NSUInteger i = 0; i < images.count; i++) { // 图片经过等比压缩后得到的二进制文件 NSData *imageData = UIImageJPEGRepresentation(images[i], imageScale ?: 1.f); // 默认图片的文件名, 若fileNames为nil就使用 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyyMMddHHmmss"; NSString *str = [formatter stringFromDate:[NSDate date]]; NSString *imageFileName = NSStringFormat(@"%@%ld.%@",str,i,imageType?:@"jpg"); [formData appendPartWithFileData:imageData name:name fileName:fileNames ? NSStringFormat(@"%@.%@",fileNames[i],imageType?:@"jpg") : imageFileName mimeType:NSStringFormat(@"image/%@",imageType ?: @"jpg")]; } } progress:^(NSProgress * _Nonnull uploadProgress) { //上传进度 dispatch_sync(dispatch_get_main_queue(), ^{ progress ? progress(uploadProgress) : nil; }); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (_isOpenLog) {PPLog(@"responseObject = %@",responseObject);} [[self allSessionTask] removeObject:task]; success ? success(responseObject) : nil; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (_isOpenLog) {PPLog(@"error = %@",error);} [[self allSessionTask] removeObject:task]; failure ? failure(error) : nil; }]; // 添加sessionTask到数组 sessionTask ? [[self allSessionTask] addObject:sessionTask] : nil ; return sessionTask;能否异步多线程上传
最新发布
07-25
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值