iOS 解決上傳100張圖片內(nèi)存奔潰問題

最近項目需求,從相冊中提取100張圖片,然后上傳到服務(wù)器。前提是圖片不能壓縮。因為要將圖片信息采集出來制作出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或者更大的時候,就會導(dǎo)致奔潰。

  • 模擬器彈出的框子是這樣說的。


    3BE4EE0E-5A0F-408E-B3EE-DA9D0BCFDBAE.png
  • 意思就是內(nèi)存警告直接把app給carsh掉了

屏幕快照 2017-03-11 上午9.52.23.png
  • 我抓拍的瞬間,內(nèi)存急速暴漲。

原因: 就是因為image,data的局部變量在內(nèi)存中沒有及時釋放導(dǎo)致占用內(nèi)存過大,導(dǎo)致程序被殺死。

解決方法。及時釋放局部變量就可以了。在局部變量中間加入自動釋放池。


[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) {
        
   }]

自動釋放池概述

自動釋放池被置于一個堆棧中,雖然它們通常被稱為被“嵌套”的。當(dāng)您創(chuàng)建一個新的自動釋放池時,它被添加到堆棧的頂部。當(dāng)自動釋放池被回收時,它們從堆棧中被刪除。當(dāng)一個對象收到送autorelease消息時,它被添加到當(dāng)前線程的目前處于棧頂?shù)淖詣俞尫懦刂?。你不能向自動釋放池發(fā)送autorelease或retain消息。Application Kit會在一個事件周期(或事件循環(huán)迭代)的開端—比如鼠標(biāo)按下事件—自動創(chuàng)建一個自動釋放池,并且在事件周期的結(jié)尾釋放它,因此您的代碼通常不必關(guān)心。 有三種情況您應(yīng)該使用您自己的自動釋放池:

如果您正在編寫一個不是基于Application Kit的程序,比如命令行工具,則沒有對自動釋放池的內(nèi)置支持;您必須自己創(chuàng)建它們。

如果您生成了一個從屬線程,則一旦該線程開始執(zhí)行,您必須立即創(chuàng)建您自己的自動釋放池;否則,您將會泄漏對象。

如果您編寫了一個循環(huán),其中創(chuàng)建了許多臨時對象,您可以在循環(huán)內(nèi)部創(chuàng)建一個自動釋放池,以便在下次迭代之前銷毀這些
對象。這可以幫助減少應(yīng)用程序的最大內(nèi)存占用量。

隊列上傳看我這篇文章

http://www.itdecent.cn/p/5162df747879

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容