2014-09-05 36 views
0

我使用AVCaptureSession來'錄製'音頻和視頻,並使用AVAssetWriter來實際上記錄它。當我的viewController加載時,視圖顯示來自攝像機的'直播',但還沒有錄製(存儲到磁盤)。但是,記憶使用逐漸增加,並且不會停止。我用Instruments並試圖找到泄漏,但我不知道如何解釋這一點。行VM:Allocation 16,00 KB不斷增加,我不確定它是什麼。我的AVFoundation/AVCaptureSession泄漏內存在哪裏?

Leak?

我委託法的實施幾乎什麼也不做,在這一點上:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer: 
(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{ 
    CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer); 

    CFRetain(sampleBuffer); 
    CFRetain(formatDescription); 

    dispatch_async(movieWritingQueue, ^{ 

     //If recording 
     if(assetWriter){ 
      //do stuff 
     } 
    }); 

    CFRelease(sampleBuffer); 
    CFRelease(formatDescription); 
} 

的問題是;當加載視圖(在開始記錄之前)時,assetWriter始終爲零,因爲它應該是。所以每次調用上面的委託方法時,都不應該做任何事情。 我從來沒有做過太多的發佈,因爲ARC一直爲我解決這個問題。我是否在做錯CF的事情?

我的方法每次都以某種方式存儲這些變量之一嗎?

+0

這些CFRetains的理由是什麼?這是一件很奇怪的事情。 – matt 2014-09-05 19:08:49

+0

@matt雖然在它們之間有'dispatch_async()',但它們並沒有真正的效果。 – trojanfoe 2014-09-05 19:09:36

+0

@trojanfoe我完全和你在一起,但它仍然是完全沒有必要的,並且很高興知道CFRetain/CFRelease對發生的所有事情都會被刪除。 – matt 2014-09-05 19:10:13

回答

1

回答我的問題在這裏:

在我打開Enable Zombie Objects更好地調試一個奇怪的例外,我所經歷的開發較早。顯然,這個設置創建了殭屍,或者可能阻止ARC釋放某些對象或任何東西。通過Product->Edit Scheme->Enable Zombie Objects禁用此選項,它按預期工作,沒有泄漏。