標籤: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) { }]
螢幕快照 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張圖片記憶體奔潰問題