最近項目需求,從相冊中提取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)存占用量。
