2012-03-10 7 views
14

Estoy trabajando en una aplicación que manipula fotos HD. Estoy tomando una foto con una sesión AVCaptureSession, deteniéndola y luego aplicando efectos en esa foto.AVCaptureSession obtener advertencia de memoria y bloqueo sin motivo

Lo que me pone loco es que todo funciona bien, los instrumentos me dicen que lanzo toda la memoria que uso correctamente y a tiempo. Realmente va alto, a veces a 100mb. Pero baja rápidamente

Luego reinicio mi sesión de captura y recibo una advertencia de memoria. No hay absolutamente ninguna razón para eso; _; Toda la memoria que utilicé si se liberó ... Entonces, la próxima vez que reinicie la sesión de captura la aplicación se bloquea. Sin mensajes, sin registros, nada en absoluto.

No sé cómo resolver esto, no sé dónde buscar ... ¡Si alguien pudiera ayudarme un poco estaría tan contento!

¡Gracias de antemano!

+0

Algún código ayudaría. –

Respuesta

22

He tenido las mismas frustraciones. Estaba usando ARC en un proyecto en el que presentaba una cámara usando AV Foundation. Después de presentar y abrir el controlador de vista varias veces, mi aplicación recibiría una advertencia de poca memoria y, posteriormente, se bloqueó. Los instrumentos tampoco ayudaron mucho. Descubrí la solución experimentando:

Aunque está utilizando ARC en su clase de cámara, puede implementar el método dealloc (simplemente no llame al super en dealloc).

- (void)dealloc { 
    AVCaptureInput* input = [session.inputs objectAtIndex:0]; 
    [session removeInput:input]; 
    AVCaptureVideoDataOutput* output = [session.outputs objectAtIndex:0]; 
    [session removeOutput:output]; 
    [session stopRunning]; 
} 

Este se encarga de detener el AVCaptureSession y asegurando que no tiene entradas o salidas todavía vivos.

+2

@bryndodayle me salvaste la vida, ¡muchas gracias! –

+0

¿Por qué solo se eliminan las primeras entradas y salidas? ¿por qué no eliminar todas las entradas y salidas? –

13

tengo topa con el mismo problema que he encontrado esta línea es el principal problema

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 

Basta con retirar la previewlayer de la capa súper mientras desasignando y no hay ningún problema de memoria. Mi función de cancelar la asignación es como sigue

-(void)deallocSession 
{ 
[captureVideoPreviewLayer removeFromSuperlayer]; 
for(AVCaptureInput *input1 in session.inputs) { 
    [session removeInput:input1]; 
} 

for(AVCaptureOutput *output1 in session.outputs) { 
    [session removeOutput:output1]; 
} 
[session stopRunning]; 
session=nil; 
outputSettings=nil; 
device=nil; 
input=nil; 
captureVideoPreviewLayer=nil; 
stillImageOutput=nil; 
self.vImagePreview=nil; 

} 

llamé a esta función antes de hacer estallar y empujando a cualquier otro punto de vista. Solucionó mi problema.

Cuestiones relacionadas