2014-09-05 66 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禁用此选项,它按预期工作,没有泄漏。