iOS 解决上传100张图片内存奔溃问题

最近项目需求,从相册中提取100张图片,然后上传到服务器。前提是图片不能压缩。因为要将图片信息采集出来制作出3D模型。所以必须是高清图片。

  • 先看下代码
[NetWorking uploadWithUrl:@"xxx" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

        for (int i = 0; i<imageArr.count; i++) {

                UIImage *image = imageArr[i];
                NSData *data = UIImageJPEGRepresentation(image, 1.0);
                [formData appendPartWithFileData:data name:@"files" fileName:@"xxxx" mimeType:@"image/jpeg"];

        }

    } withProgress:^(NSProgress *uploadProgress) {

    } success:^(id responseObject) {

    } failure:^(NSError *error) {

   }]

  • 如果imageArr是100或者更大的时候,就会导致奔溃。
  • 模拟器弹出的框子是这样说的。

    3BE4EE0E-5A0F-408E-B3EE-DA9D0BCFDBAE.png

  • 意思就是内存警告直接把app给carsh掉了

屏幕快照 2017-03-11 上午9.52.23.png

  • 我抓拍的瞬间,内存急速暴涨。

原因: 就是因为image,data的局部变量在内存中没有及时释放导致占用内存过大,导致程序被杀死。

解决方法。及时释放局部变量就可以了。在局部变量中间加入自动释放池。


[NetWorking uploadWithUrl:@"xxx" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

        for (int i = 0; i<imageArr.count; i++) {

         @autoreleasepool {
                UIImage *image = imageArr[i];
                NSData *data = UIImageJPEGRepresentation(image, 1.0);
                [formData appendPartWithFileData:data name:@"files" fileName:@"xxxx" mimeType:@"image/jpeg"];

         }

        }

    } withProgress:^(NSProgress *uploadProgress) {

    } success:^(id responseObject) {

    } failure:^(NSError *error) {

   }]

自动释放池概述

自动释放池被置于一个堆栈中,虽然它们通常被称为被“嵌套”的。当您创建一个新的自动释放池时,它被添加到堆栈的顶部。当自动释放池被回收时,它们从堆栈中被删除。当一个对象收到送autorelease消息时,它被添加到当前线程的目前处于栈顶的自动释放池中。你不能向自动释放池发送autorelease或retain消息。Application Kit会在一个事件周期(或事件循环迭代)的开端—比如鼠标按下事件—自动创建一个自动释放池,并且在事件周期的结尾释放它,因此您的代码通常不必关心。 有三种情况您应该使用您自己的自动释放池:

如果您正在编写一个不是基于Application Kit的程序,比如命令行工具,则没有对自动释放池的内置支持;您必须自己创建它们。

如果您生成了一个从属线程,则一旦该线程开始执行,您必须立即创建您自己的自动释放池;否则,您将会泄漏对象。

如果您编写了一个循环,其中创建了许多临时对象,您可以在循环内部创建一个自动释放池,以便在下次迭代之前销毁这些

对象。这可以帮助减少应用程序的最大内存占用量。


作者:王银博链接:http://www.jianshu.com/p/9e84fe63d5c0來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
时间: 2024-10-07 02:40:45

iOS 解决上传100张图片内存奔溃问题的相关文章

解决ios手机上传竖拍照片旋转90度的问题

html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非横拍的ios照片进行角度旋转修正. 这里主要利用exif.js读取照片的拍摄信息. Exif.js 提供了 JavaScript 读取图像的原始数据的功能扩展,例如:拍照方向.相机设备型号.拍摄时间.ISO 感光度.GPS 地理位置等数据. EXIF 数据主要来自拍摄的照片,多用于移动端开发,PC

ios系统 竖屏拍照 canvas处理后 图片旋转(利用exif.js解决ios手机上传竖拍照片旋转90度问题)

转:https://www.cnblogs.com/lovelgx/articles/8656615.html ---恢复内容开始--- 问题:html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 解决方法:利用exif.js解决ios手机上传竖拍照片旋转90度问题 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非横拍的ios照片进行角度旋转修正. 利用exif.js读取照片的拍摄信息,详见 htt

【JS】【33】解决 重复上传同一张图片,第二次无反应 的问题

正文: <input style="display:none" type="file" id="img" οnchange="uploadImage(event)" accept="image/jpg, image/jpeg, image/gif, image/png"> 问题:用户上传图片A,然后点击删除,然后又再次上传图片A,程序没有反应 原因:第二次上传还是上一张图片的时候,onchang

上传图片删除后,不能上传同一张图片的解决方法

js上传一张图片后, 删除后, 不能再次上传该图片, 用户体验不是很好 <div class="uploader-input-box"> <input class="uploader-input" id="uploader-input" name="imgurl" type="file"> </div> 解决方式 修改input的value值 $('#uploader-i

ASP.NET(C#)实现一次性动态上传多张图片的代码(多个文件)

在做asp.net的Web开发的时候,我们经常会遇到一次性上传多个文件的需求.通常我们的解决方法是固定放多个上传文件框,这样的解决办法显然是不合理的,因为一次上传多个,就意味着数量不确定.因此我们就要让这些文件上传框动态添加,下面我以我做的一个图库管理中的上传图片的功能为例 默认是上传一个图片,但当我们点“增加图片”按钮时可以实现选择多个图片及其描述同时上传,本功能限制一次最多只能上传8张,且每张图片大小不超过1M,这个大家可根据实际情况更改! 第一步,使用javascript代码实现动态添加文

微信JSSDK上传多张图片

之前是使用for循环实现的,但是安卓手机没有问题,苹果手机只能上传最后一张图片. 好在有高手在前面趟路,实用的循环调用.苹果是没有,安卓不清楚.以下内容转自:http://leo108.com/pid-2069.asp 做过微信开发的都知道,在部分android机型里微信不支持网页上传图片的,这是由于这些机型的文件上传存在内存泄漏,会导致微信闪退,所以微信内置浏览器将文件上传屏蔽.这就导致这些机型的用户在使用微信浏览器访问某些需要上传图片的网页时功能不正常. 前不久微信公开了一些接口,其中有一个

php如何解析IOS/Android上传的Json消息

使用yii框架php服务器接收IOS/Android上传的Json消息时,$_POST. Yii::app()->request->getPost()结果都将为null. 使用file_get_contents("php://input")才能够正常获取. "php://input"可以访问请求的原始数据,并且带给内存的压力更小. 例子如下: class appController extends Controller { public function

关于最新版AFNetworking(3.0)上传多张图片的问题

最新版的AF已经废弃了很多以前的类,所以很多以前的方法都不能用了,当然最主要还是为了适应ipV6所做的更改.楼主最近正在写多张图片上传,碰到了一些问题,解决之后直接封装了一个方法,废话有点多了,上代码: //上传多张图片 + (void)requestWithUrl:(NSString *)url withPostedImages:(NSArray *)imagesArray WithSuccessBlock:(void (^)(NSArray * resultArray))successBlo

php+apache 解决上传文件过大问题

php+apache 解决上传文件过大问题 博客分类: php PHPApache 用php+apache上传文件的时候,由于文件过大,容易导致上传失败,解决办法: 修改php.ini中: upload_max_filesize  2m  即允许上传文件大小的最大值.默认为2M ,大小可以根据你                              的需要进行修改 post_max_size  20m  指通过表单POST给PHP的所能接收的最大值,包括表单里的所有