内存警告UIImagepickerController IOS 7

任何人都可以帮助我解决这个问题,我对客观的c和iOS有点新鲜.我一直在努力,但我无法弄清楚如何解决问题,我的应用程序非常简单,只有启动相机拍照并通过电子邮件发送到我们的服务器.这个代码在iOS6中工作得很好.

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

-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediawithInfo:(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 context
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);//also this line in Instruments
UIImage *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...
        });           
    });
}

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...