zoukankan      html  css  js  c++  java
  • 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
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    迷の“良心”膜你赛总结*3
    bzoj1704/poj3276[Usaco2007 Mar]Face The Right Way自动转身机
    poj 1840 -- Eqs
    poj 3274 -- Gold Balanced Lineup
    poj 3349 -- Snowflake Snow Snowflakes
    poj 2442 -- Sequence
    BestCoder Round #1 1002 项目管理 (HDU 4858)
    BestCoder Round #1 1001 逃生 (HDU 4857)
    poj 1273 -- Drainage Ditches
    poj 1149 -- PIGS
  • 原文地址:https://www.cnblogs.com/tangyuanby2/p/7999642.html
Copyright © 2011-2022 走看看