iphone - uiimagepickercontrollerdelegate - Recibió aviso de memoria. Nivel=1 cuando se muestra un UIImagePickerController
uiimagepickercontrollerdelegate swift 4 (7)
¡¡¡Esto me está volviendo loco!!!
Recibo una "Advertencia de memoria recibida. Nivel = 1" cada vez que intento mostrar un UIImagePickerController con un sourceType = UIImagePickerControllerSourceTypeCamera.
Aquí está el código de mi viewDidLoad donde configuro las cosas:
- (void)viewDidLoad {
[super viewDidLoad];
// Set card table green felt background
self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"green_felt_bg.jpg"]];
// Init UIImagePickerController
// Instantiate a UIImagePickerController for use throughout app and set delegate
self.playerImagePicker = [[UIImagePickerController alloc] init];
self.playerImagePicker.delegate = self;
self.playerImagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}
Y aquí es cómo lo presento modalmente.
- (IBAction) addPlayers: (id)sender{
[self presentModalViewController:self.playerImagePicker animated:YES];
}
El resultado ... UIImagePicker comienza a mostrarse y luego auge ... Recibo la advertencia de memoria ... ¡CADA VEZ! Curiosamente, si cambio a sourceType = UIImagePickerControllerSourceTypePhotoLibrary ... todo funciona bien.
¿Qué diablos estoy perdiendo o haciendo mal? Todo lo que quiero hacer es mostrar la cámara, tomar y guardar una foto.
FYI - Estoy probando en mi dispositivo 3GS.
Gracias a cualquiera que pueda ayudar :)
Ahora, después de actualizar a 4.0, también le pasa a mi aplicación; antes, en 3.1, no había advertencias.
En realidad, como dijiste antes, no debería haber ningún problema. Sin embargo, esto hace que la vista que viene después se vuelva a cargar y se llame a viewDidLoad. Esto desordena mi aplicación, ya que inicializo la vista en viewDidLoad, ahora se vuelve a inicializar nuevamente, aunque no debería.
¡Solo como un comentario, esto también puede suceder con muchas otras aplicaciones que dependen de cargar la vista solo una vez!
El UIImagePickerControllerDelegate
es un UIImagePickerControllerDelegate
memoria porque está capturando activos de memoria alta, ya sea una imagen o un video. Por lo tanto, desde el principio, asegúrese de especificar la configuración de captura del medio, como punto de inicio, redúzcalo si no necesita la calidad:
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.videoQuality=UIImagePickerControllerQualityTypeMedium;
Luego, después de capturar y usar estos activos. Elimine los archivos temporales de la carpeta temporal de aplicaciones. Podría ser un paso extra obsesivo pero es un buen hábito:
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:[lastCapturedFile substringFromIndex:7] ]) {
NSError *error;
// Attempt to delete the folder containing globalDel.videoPath
if ([fileManager removeItemAtPath:[lastCapturedFile substringFromIndex:7] error:&error] != YES) {
NSLog(@"Unable to delete recorded file: %@", [error localizedDescription]);
} else {
NSLog(@"deleted file");
}
}
Con lo anterior se está borrando el archivo que fue creado por el delegado. En algunos casos, si está transcodificando o creando sus propios activos, elimine la carpeta con ese archivo. Nota arriba, estoy eliminando la parte ''file: //'' de la cadena url ya que al administrador de archivos no le gusta:
[lastCapturedFile substringFromIndex:7]
Otras cosas a considerar están cubiertas en la documentación diversa de lo que está haciendo con ese activo: transcodificación, reducción de tamaño de imagen y más. Tenga en cuenta que cualquier transcodificación utilizando AVFoundation
se bloqueará si se muestra el UIImagePickerViewController
.
Esto es muy común . Mientras manejas la advertencia de memoria sin fallar y tengas suficiente espacio para seguir, no dejes que te vuelva loco.
He estado luchando con el mismo problema desde hace algunos días. Sin embargo, restablecer mi iPhone 4 (borrar la memoria) resuelve el problema por lo que no es realmente un problema de la aplicación.
Parece que una advertencia de memoria de nivel 1 o 2 activa al delegado UIimgPickerController para que se descargue. Lo mismo sucede en mi aplicación con el delegado del delegado (sí puede). Sin embargo, después de la advertencia de memoria, se cargará el delegado (y su delegado) nuevamente, lo que hará que viewDidLoad ejecute cualquier código que esté allí.
No estoy seguro de que esto ocurra solo mientras se utiliza el controlador UIimgPickerController porque probar todo eso lleva mucho tiempo.
Podría escribir algún código adicional para evitar que el código en viewDidLoad en viewWillAppear no se ejecute mientras se muestra el UIimgPickerController, pero eso no es elegante, ¿verdad?
Aquí se puede pensar: podría ser que se esté quedando sin memoria porque está probando su aplicación. Con algunas hojas de memoria es muy posible que esté trabajando para solucionar este problema cada vez que realice una depuración.
No se trata de la cantidad de memoria que ha utilizado su aplicación, ya que probablemente sucederá incluso cuando escriba una aplicación muy simple que solo tenga una vista con un botón, haga clic en el botón y luego abra la cámara. He probado en iPhone 3GS, iPad 2 y iPod touch 3G. Solo sucedió en iPhone 3GS. Descubrí que no volverá a suceder si reinicia su dispositivo antes de ejecutar su aplicación.
Otra solución real es comentar el código, [super didReceiveMemoryWarning]
, en su viewController.
- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn''t have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren''t in use.
}
Después de muchas pruebas en iPhone 3GS con iOS 4.3.2, encontré que a la lógica le podría gustar eso: -> Abrir tanto como la aplicación que se ejecuta en segundo plano -> Presentar un imagePicker de UIImagePickerController, hacer clic en "Atrás" o "Guardar" de imagePicker - > El método ApplicationDelegate, applicationDidReceiveMemoryWarning:(UIApplication *)application
, se invocará -> Luego el método ViewController, didReceiveMemoryWarning:
se invocará -> Then viewDidUnload -> Then viewDidLoad
Luego, puede encontrar algunas vistas publicadas y la vista actual ha sido apuntada a una inesperada.
De forma predeterminada, [super didReceiveMemoryWarning]
se ejecutará cuando se didReceiveMemoryWarning
método didReceiveMemoryWarning
de ViewController. viewDidUnload:
, y viewDidUnload:
y viewDidLoad:
métodos no serán invocados. Significa que la advertencia de mem ha sido totalmente ignorada. Eso es lo que esperábamos.
Ocurrió en mi aplicación Did I Do That en iOS 4.0 también. No fue coherente, pero la causa más común fue crear una instancia de UIImagePickerController
y navegar a una foto grande almacenada en uno de los álbumes.
Corregido por el estado persistente en el método didReceiveMemoryWarning
, y la carga del estado en el método viewDidLoad. Una advertencia es recordar borrar el archivo de estado persistente en el punto correcto para su aplicación. Para mí fue dejar el controlador UIView relevante en circunstancias normales.
También recibo la advertencia de memoria cuando abro un UIImagePickerController. Estoy en 4.01 también. Pero además, el UIImagePickerController está ejecutando la animación del obturador cerrado y se está parando allí, con el obturador cerrado en la pantalla.
Parece que el comportamiento del UIImagePickerController en las advertencias de memoria es cerrarse. Podría descartar el UIImagePickerController del ViewController principal en el método didReceiveMemoryWarning, pero eso supondría una experiencia terrible para el usuario.
¿Alguien ha visto este problema? ¿Hay una manera de manejar la advertencia de memoria para que el UIImagePickerController no se cierre?