内存警告UIImagepickerController IOS 7

内存警告UIImagepickerController IOS 7,第1张

概述任何人都可以帮助我解决这个问题,我对客观的c和iOS有点新鲜.我一直在努力,但我无法弄清楚如何解决问题,我的应用程序非常简单,只有启动相机拍照并通过电子邮件发送到我们的服务器.这个代码在iOS6中工作得很好. 当我拍照时,我的内存是每个屏幕捕获的堆增长,我得到“收到内存警告”,最后 – 由于内存压力而终止. – -(void)imagePickerController:(UIImagePicker 任何人都可以帮助我解决这个问题,我对客观的c和iOS有点新鲜.我一直在努力,但我无法弄清楚如何解决问题,我的应用程序非常简单,只有启动相机拍照并通过电子邮件发送到我们的服务器.这个代码在iOS6中工作得很好.

当我拍照时,我的内存是每个屏幕捕获的堆增长,我得到“收到内存警告”,最后 – 由于内存压力而终止. –

-(voID)imagePickerController:(UIImagePickerController *)pickerdIDFinishPickingMediawithInfo:(NSDictionary *)info{[self.popoverController2 dismisspopoverAnimated:true];Nsstring *mediaType = [info                       objectForKey:UIImagePickerControllerMediaType];if ([mediaType isEqualToString:(Nsstring *)kUTTypeImage]) {    _image = [info                      objectForKey:UIImagePickerControllerOriginalimage];   _image = [self fixrotation:_image]; //<----- increased memory when UIImageWritetoSavedPhotosAlbum is uncommented IF is comment it doesn't increased memory but after some pictures I start to get "Received Memory Warning" message until the app Crash.    if (_newMedia){       UIImageWritetoSavedPhotosAlbum(_image,self,@selector(image:finishedSavingWithError:contextInfo:),nil);    [self dismissVIEwControllerAnimated:NO completion:nil];    [self performSegueWithIDentifIEr:@"SeleccionadoCameraR" sender:self];    }else{        [self performSegueWithIDentifIEr:@"SeleccionadoCameraR" sender:self];    }}}- (UIImage *)fixrotation:(UIImage *)image{if (image.imageOrIEntation == UIImageOrIEntationUp) return image;CGAffinetransform transform = CGAffinetransformIDentity;switch (image.imageOrIEntation) {    case UIImageOrIEntationDown:    case UIImageOrIEntationDownMirrored:        transform = CGAffinetransformTranslate(transform,image.size.wIDth,image.size.height);        transform = CGAffinetransformRotate(transform,M_PI);        break;    case UIImageOrIEntationleft:    case UIImageOrIEntationleftMirrored:        transform = CGAffinetransformTranslate(transform,0);        transform = CGAffinetransformRotate(transform,M_PI_2);        break;    case UIImageOrIEntationRight:    case UIImageOrIEntationRightmirrored:        transform = CGAffinetransformTranslate(transform,-M_PI_2);        break;    case UIImageOrIEntationUp:    case UIImageOrIEntationUpMirrored:        break;}switch (image.imageOrIEntation) {    case UIImageOrIEntationUpMirrored:    case UIImageOrIEntationDownMirrored:        transform = CGAffinetransformTranslate(transform,0);        transform = CGAffinetransformScale(transform,-1,1);        break;    case UIImageOrIEntationleftMirrored:    case UIImageOrIEntationRightmirrored:        transform = CGAffinetransformTranslate(transform,image.size.height,1);        break;    case UIImageOrIEntationUp:    case UIImageOrIEntationDown:    case UIImageOrIEntationleft:    case UIImageOrIEntationRight:        break;}// Now we draw the underlying CGImage into a new context,applying the transform// calculated above.CGContextRef ctx = CGBitmapContextCreate(NulL,CGImageGetBitsPerComponent(image.CGImage),CGImageGetcolorSpace(image.CGImage),CGImageGetBitmAPInfo(image.CGImage));CGContextConcatCTM(ctx,transform);switch (image.imageOrIEntation) {    case UIImageOrIEntationleft:    case UIImageOrIEntationleftMirrored:    case UIImageOrIEntationRight:    case UIImageOrIEntationRightmirrored:        // Grr...        CGContextDrawImage(ctx,CGRectMake(0,image.size.wIDth),image.CGImage);        break;    default:        CGContextDrawImage(ctx,image.size.height),image.CGImage); //when I use instruments it shows that My VM is because of this         break;}// And Now we just create a new UIImage from the drawing contextCGImageRef cgimg = CGBitmapContextCreateImage(ctx);//also this line in InstrumentsUIImage *img = [UIImage imageWithCGImage:cgimg];CGContextRelease(ctx);CGImageRelease(cgimg);return img; }

可能是内存管理.我会感谢你的帮助

解决方法 您使用fixRotation方法处于正确的轨道.但是,您也应该调整图像的大小.否则,图像会很大,大约30 MB(取决于设备).

结帐this blog post如何正确调整图像大小.具体来说,您需要的UIImage类别文件是:


UIImage+Resize.h


UIImage+Resize.m

在后台线程上也是一个好主意.这样的东西

- (voID)imagePickerController:(UIImagePickerController *)imagePicker dIDFinishPickingMediawithInfo:(NSDictionary *)info{    // dismiss the image picker first to free its memory    [self dismissVIEwControllerAnimated:YES completion:nil];    UIImage *originalimage = info[UIImagePickerControllerOriginalimage];    if (!originalimage)        return;    // Optionally set a placeholder image here while resizing happens in background    dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAulT,0),^{        // Set desired maximum height and calculate wIDth        CGfloat height = 640.0f;  // or whatever you need        CGfloat wIDth = (height / originalimage.size.height) * originalimage.size.wIDth;        // Resize the image        UIImage * image = [originalimage resizedImage:CGSizeMake(wIDth,height) interpolationQuality:kCGInterpolationDefault];        // Optionally save the image here...        dispatch_async(dispatch_get_main_queue(),^{            // ... Set / use the image here...        });               });}
总结

以上是内存溢出为你收集整理的内存警告UIImagepickerController IOS 7全部内容,希望文章能够帮你解决内存警告UIImagepickerController IOS 7所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1097485.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存