iOS 解決上傳100張圖片記憶體奔潰問題

來源:互聯網
上載者:User

標籤:undefined   cat   分享   ati   www   概述   format   -o   方法   

最近項目需求,從相簿中提取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張圖片記憶體奔潰問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.