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

Posted BigBaHuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。







以上是关于iOS 解决上传100张图片内存奔溃问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 2.0 从 iOS 应用程序以流的形式上传 100 张图像

ios8:如何使用 NSURLSession 在后台上传 100 张照片?可用空间问题

php中上传多张图片,如何解决?

Android高效内存1:一张图片占用多少内存

为啥我提问想法张图,老是图片上传失败

使用 AFNetworking、ios 上传图片