我正在开发一款操作高清照片的应用。我正在用AVCaptureSession拍照,停止它然后对该照片应用效果。
让我疯狂的是,一切正常,乐器告诉我,我按时正确地释放了我使用的所有内存。它真的很高,有时达到100mb。但它很快就会下降。
然后我重启我的Capture Session并收到内存警告。绝对没有理由; _;我释放时使用的所有内存...然后下次我将重新启动捕获会话时应用程序崩溃。没有消息,没有日志,什么也没有。
我不知道如何解决这个问题,我不知道在哪里寻找...如果有人能帮助我一点点我会很高兴的!
提前致谢!
答案 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;
}
我在弹出并推送任何其他视图之前调用了此函数。它解决了我的问题。