AVCaptureSession没有任何理由得到内存警告和崩溃

时间:2012-03-10 08:01:21

标签: iphone warnings avcapturesession

我正在开发一款操作高清照片的应用。我正在用AVCaptureSession拍照,停止它然后对该照片应用效果。

让我疯狂的是,一切正常,乐器告诉我,我按时正确地释放了我使用的所有内存。它真的很高,有时达到100mb。但它很快就会下降。

然后我重启我的Capture Session并收到内存警告。绝对没有理由; _;我释放时使用的所有内存...然后下次我将重新启动捕获会话时应用程序崩溃。没有消息,没有日志,什么也没有。

我不知道如何解决这个问题,我不知道在哪里寻找...如果有人能帮助我一点点我会很高兴的!

提前致谢!

2 个答案:

答案 0 :(得分:22)

我有同样的挫败感。我在一个项目中使用ARC,我正在使用AV Foundation呈现相机。在呈现并弹出视图控制器几次后,我的应用程序将收到低内存警告,并随后崩溃。仪器也没有多大帮助。我通过试验发现了解决方案:

即使您在相机类中使用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并确保它没有输入或输出仍然存在。

答案 1 :(得分:13)

我遇到同样的问题我发现这一行是主要问题

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];

在解除分配时,只需从超级层移除预览层,并且没有内存问题。我的解除分配功能如下

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

}

我在弹出并推送任何其他视图之前调用了此函数。它解决了我的问题。