2012-03-10 7 views
14

Sto lavorando a un'app che manipola le foto HD. Sto scattando una foto con una AVCaptureSession, fermandola e applicando gli effetti su quella foto.AVCaptureSession richiama la memoria e si blocca senza motivo

La cosa che mi fa impazzire è che tutto funziona bene, gli strumenti mi dicono che rilascio tutta la memoria che uso correttamente e in tempo. Va davvero alto sì, a volte a 100mb. Ma scende rapidamente.

Quindi riavvio la sessione di acquisizione e ho ricevuto un avviso di memoria. Non c'è assolutamente alcun motivo per questo; _; Tutta la memoria che ho usato se liberata ... Poi la prossima volta che riavvierò la sessione di cattura l'app si blocca. Nessun messaggio, nessun registro, niente di niente.

Non so come risolvere questo, non so dove cercare ... Se qualcuno potesse aiutarmi un po 'sarei così felice!

Grazie in anticipo!

+0

Un po 'di codice sarebbe d'aiuto. –

risposta

22

Ho avuto le stesse frustrazioni. Stavo usando ARC in un progetto in cui stavo presentando una videocamera usando AV Foundation. Dopo aver presentato e scoccato il controller della vista un paio di volte, la mia app avrebbe ricevuto un avviso di memoria insufficiente e successivamente un arresto anomalo. Anche gli strumenti non sono stati di grande aiuto. Ho scoperto la soluzione sperimentando:

Anche se si utilizza ARC nella classe della telecamera, è possibile implementare il metodo dealloc (semplicemente non chiamare super su dealloc).

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

Questo si occupa di fermare l'AVCaptureSession e assicurando che non ha ingressi o uscite ancora vivi.

+2

@bryndodayle mi hai salvato la vita, grazie mille! –

+0

Perché solo i primi input e output vengono rimossi? perché non rimuovere tutti gli ingressi e le uscite? –

13

ho incontrare lo stesso problema che ho trovato questa linea è il problema principale

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 

è sufficiente rimuovere la previewlayer dallo strato super-mentre deallocando e non v'è alcun problema di memoria. La mia funzione di deallocating è la seguente

-(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; 

} 

Ho chiamato questa funzione prima di scattare e premere qualsiasi altra vista. Ha risolto il mio problema.