2012-03-10 80 views
14

我正在處理高清照片的應用程序。我正在使用AVCaptureSession拍攝一張照片,將其停止,然後在該照片上應用效果。AVCaptureSession無理由獲取內存警告和崩潰

讓我瘋狂的事情是,一切工作正常,儀器告訴我,我釋放了所有我正確使用的內存並準時。它非常高,有時達到100MB。但它迅速下降。

然後我重新啓動我的捕獲會話,我得到了一個內存警告。這絕對沒有理由; _;我使用的所有內存如果釋放...然後下一次我將重新啓動捕獲會話應用程序崩潰。沒有消息,沒有日誌,什麼也沒有。

我不知道該如何解決這個問題,我不知道在哪裏尋找......如果有人能幫助我一點點,我會很高興!

在此先感謝!

+0

一些代碼會有所幫助。 – 2012-04-04 16:43:12

回答

22

我有過同樣的挫折感。我在一個使用AV基金會展示相機的項目中使用ARC。在呈現並彈出視圖控制器幾次後,我的應用程序會收到低內存警告,並隨後崩潰。儀器也沒有太大的幫助。我通過實驗發現瞭解決方案:

即使您在相機類中使用ARC,也可以實現dealloc方法(不要在dealloc上調用super)。

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

這需要停止AVCaptureSession並確保它沒有輸入或輸出仍然活着的照顧。

+2

@bryndodayle你救了我的命,非常感謝你! – 2013-12-04 17:08:26

+0

爲什麼只是第一次輸入和輸出被刪除?爲什麼不移除所有的輸入和輸出? – 2015-04-11 06:01:12

13

我遇到我發現這行了同樣的問題是主要問題

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 

剛剛從超層,同時重新分配,沒有內存問題卸下previewlayer。我的釋放功能如下

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

} 

我在彈出和推送任何其他視圖之前調用了此函數。它解決了我的問題。

相關問題