您的位置:首页 > 移动开发 > IOS开发

iOS 解决上传100张图片内存奔溃问题

2017-12-07 16:19 627 查看

最近项目需求,从相册中提取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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: