La aplicación iOS se bloquea al tomar una foto

mi aplicación se bloquea al tomar una foto debido a un problema de memory.

Ahora intenté analizar mi memory con instrumentos y, de hecho, estoy usando un máximo de 23 MB cuando la aplicación falla. Lo comparé con esa aplicación de Facebook y usa más de 70 MB, así que no tengo una idea de por qué estoy recibiendo advertencias de memory …

Yo uso el siguiente código:

OverlayView *overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypeCamera; picker.cameraOverlayView = overlay; [self presentViewController:picker animated:NO completion:nil]; 

Nota: Lo he intentado sin la vista de superposition y no parece cambiar y lo probé con y sin animation.

Por cierto, la aplicación no falla al presentar el gráfico de imágenes, pero cuando se muestra el gráfico de imágenes, recibo varias advertencias de memory. La aplicación se bloquea al tomar la foto o al presionar el button 'usar'. A veces, la aplicación no falla, así que estoy muy confundido.

Tal vez necesite hacer algo en el método didReceiveMemoryWarning pero no sé qué, tal vez pueda ayudarme con eso.

Xcode muestra esto:

problema de memoria

Actualizar:

Esto es lo que obtengo de la

 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImagePickerControllerMediaMetadata = { DPIHeight = 72; DPIWidth = 72; Orientation = 6; "{Exif}" = { ApertureValue = "2.526068811667588"; BrightnessValue = "3.440519128732857"; ColorSpace = 1; DateTimeDigitized = "2013:09:26 14:33:48"; DateTimeOriginal = "2013:09:26 14:33:48"; ExposureMode = 0; ExposureProgram = 2; ExposureTime = "0.03333333333333333"; FNumber = "2.4"; Flash = 24; FocalLenIn35mmFilm = 35; FocalLength = "4.28"; ISOSpeedRatings = ( 50 ); LensMake = Apple; LensModel = "iPhone 4S back camera 4.28mm f/2.4"; LensSpecification = ( "4.28", "4.28", "2.4", "2.4" ); MeteringMode = 5; PixelXDimension = 3264; PixelYDimension = 2448; SceneType = 1; SensingMethod = 2; ShutterSpeedValue = "4.906905022631062"; SubjectArea = ( 1631, 1223, 881, 881 ); SubsecTimeDigitized = 551; SubsecTimeOriginal = 551; WhiteBalance = 0; }; "{MakerApple}" = { 1 = 0; 3 = { epoch = 0; flags = 1; timescale = 1000000000; value = 779858689639583; }; 4 = 0; 5 = 128; 6 = 138; 7 = 0; }; "{TIFF}" = { DateTime = "2013:09:26 14:33:48"; Make = Apple; Model = "iPhone 4S"; Software = "7.0"; XResolution = 72; YResolution = 72; }; }; UIImagePickerControllerMediaType = "public.image"; UIImagePickerControllerOriginalImage = "<UIImage: 0x15668c60>"; 

}

No te preocupes por la advertencia de memory. Si está utilizando UIImagePickerController en dispositivos iPhone 4S o anteriores, generalmente obtendrá esta advertencia, y no puede hacer mucho al respecto.

Lo importante es que debe asegurarse de cambiar el tamaño de la image de manera adecuada a través del método de delegado para imagePickerController:didFinishPickingMediaWithInfo: Si intenta save y usar (como mostrar en UIImageView ) la image original , se bloqueará en estos dispositivos más antiguos debido a la presión de la memory.

Mira esta excelente publicación de blog para una discusión sobre la forma correcta de cambiar el tamaño de un UIImage .

Específicamente, encontrará que esta categoría es útil para cambiar el tamaño de las imágenes correctamente:

UIImage + Resize.h

UIImage + Resize.m

Si ya usas otro método que funciona, genial. De lo contrario, este método funciona muy bien.

Usando dichos methods de categoría, aquí hay un ejemplo de imagePickerController:didFinishPickingMediaWithInfo: usando GCD para hacer el cambio de tamaño en un hilo de background:

 - (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 desinetworking maximum height and calculate width CGFloat height = 640.0f; CGFloat width = (height / self.size.height) * self.size.width; UIImage * image = [originalImage resizedImage:CGSizeMake(width, height) interpolationQuality:kCGInterpolationDefault]; // Save and use this image }); } 

También estoy enfrentando el mismo problema y he encontrado un parche para minimizar el problema. Lo que hago es simplemente bloquear el hilo principal hasta que se elimine el selector de imágenes. Eso es .

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ __weak typeof(picker) wSelf = picker; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 *NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [wSelf dismissViewControllerAnimated:YES completion:^{ @try { [self saveImage:info]; } @catch (NSException *exception) { NSLog(@"Exception:%@",exception); } @finally { } }];});} -(void)saveImage:(NSDictionary *)info{ [KAppdelegate ShowLoader]; UIImage *image=(UIImage *)[info objectForKey:@"UIImagePickerControllerOriginalImage"]; ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; dispatch_queue_t queue = dispatch_queue_create("com.myApp.saveToCameraRoll", NULL); dispatch_async(queue, ^{ dispatch_semaphore_t sema = dispatch_semaphore_create(0); [library writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)[image imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){ if (error) { // handle the error } else { dispatch_async(dispatch_get_main_queue(), ^{ // perhaps indicate to the user that save has finished }); } dispatch_semaphore_signal(sema); }]; dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); });}