15

我正在开发一个处理高清照片的应用程序。我正在使用 AVCaptureSession 拍照,将其停止,然后对该照片应用效果。

让我抓狂的是,一切正常,仪器告诉我,我会按时释放我正确使用的所有内存。它真的很高,是的,有时达到 100mb。但它会迅速下降。

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

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

提前致谢!

4

2 回答 2

23

我也有同样的挫败感。我在一个使用 AV Foundation 展示相机的项目中使用了 ARC。在展示和弹出视图控制器几次后,我的应用程序会收到内存不足的警告,然后崩溃。仪器也没有太大帮助。我通过实验发现了解决方案:

即使您在相机类中使用 ARC,您也可以实现 dealloc 方法(只是不要调用superdealloc)。

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

这负责停止 AVCaptureSession 并确保它没有仍然存在的输入或输出。

于 2012-07-07T19:02:27.943 回答
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;

}

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

于 2013-12-11T06:46:29.047 回答