Siempre obtenga una advertencia de memory cuando con un UIImagePicker para camera

Estoy usando un UIImagePicker en mi viewController ,

y hay dos types de methods en los que siempre recibo una advertencia de memory, así como el famoso "wait_fences: no se pudo recibir la respuesta: 10004003",

pero no puedo rastrear la línea específica de código que solicita la advertencia: siempre viene inmediatamente después de estos methods en algún lugar que no puedo depurar.

 // in myViewController.h // the first 2 are the methods that I alloc my UIImagePicker, // here, self.photoPicker is a retained property of UIImagePicker. - (IBAction)fromAlbumButtonTapped { if (self.photoPicker == nil) { self.photoPicker = [[[UIImagePickerController alloc] init] autorelease]; self.photoPicker.delegate = self; } if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { self.photoPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentModalViewController:self.photoPicker animated:YES]; return; } } - (IBAction)fromCameraButtonTapped { if (self.photoPicker == nil) { self.photoPicker = [[[UIImagePickerController alloc] init] autorelease]; self.photoPicker.delegate = self; } if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { self.photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera; [self presentModalViewController:self.photoPicker animated:YES]; return; } } // and this is another part that gives me the memory warning - getting a photo. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { self._photo = [info objectForKey:UIImagePickerControllerOriginalImage]; self.photoView.photoView.image = self._photo; [self.photoButton setImage:self._photo forState:UIControlStateNormal]; [self dismissModalViewControllerAnimated: YES]; } 

Ya comprobé mi código y no encontré ninguna posible pérdida de memory lo mejor que puedo decir.

Sé que lidiar con una foto lleva algo de memory, por lo que es normal get una advertencia de memory.

Pero a veces el problema es que mi viewController solo release algo importante cuando aparece la advertencia, como el button para regresar al controller de ParentView en una stack de navigation.

Así que no quiero recibir una advertencia de memory si mis botones o algo más importante se va a liberar demasiado pronto.

Hay alguna manera de arreglarlo?

No toda la "pérdida" de memory es causada por una fuga. Use Heapshot.

Utilice los instrumentos para comprobar si hay pérdidas y pérdida de memory debido a la memory retenida pero no filtrada. Este último es una memory no utilizada que aún se señala. Use Heapshot en el instrumento Asignaciones en instrumentos.

Para get información acerca de cómo utilizar Heapshot para search la creación de memory, consulte: blog de bbum

Básicamente, el método consiste en ejecutar la herramienta de asignación de instrumentos, tomar un montón, ejecutar una intuición del código y otro montón repitiendo 3 o 4 veces. Esto indicará la memory asignada y no liberada durante las iteraciones.

Para averiguar los resultados divulgar para ver las asignaciones individuales.

Si necesita ver dónde se conserva, las liberaciones y autorelease se producen para un object, utilizan los instrumentos:

Ejecutar en instrumentos, en Asignaciones establecidas "Grabar counts de reference" en activado (debe detener la grabación para configurar la opción). Haga que el selector se ejecute, detenga la grabación, busque allí ivar (datePickerView), profundice y podrá ver dónde se saveon todos, las liberaciones y las autorelease.

Cuando usas UIImagePickerController, obtienes una foto. La foto puede ser bastante grande. Por ejemplo, con la camera incorporada de 8MP, eso es realmente 8MP * 3 bytes, ya que cada píxel es RGB y, si no está lleno, es de 8MP * 4 = 32MB. Entonces, no es una gran sorpresa que recibas una advertencia de memory.

Reemplace didReceiveMemoryWarning y borre la memory. Además, las vistas pueden downloadse (antes de iOS 6), por lo que debe poder volver a cargarlas correctamente en viewWillLoad. Consulte Gestión de la memory

Cambia el siguiente

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; [imageView setImage:image]; [self dismissModalViewControllerAnimated:YES]; } 

Al siguiente …

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; [self dismissModalViewControllerAnimated:YES]; [imageView setImage:image]; }