AVCaptureSession“startRunning”崩溃

时间:2012-07-05 19:59:30

标签: objective-c memory-management avfoundation avcapturesession

所以这是我的问题:我已经创建了一个自定义的AVCaptureSession来拍照。我不确定为什么,但是第三次​​打电话给startRunning时,它会崩溃。我实现了didReceiveMemoryWarning,它在崩溃之前没有被调用。我还在其上运行了仪器,没有与AVCaptureSession相关的内存泄漏。在XCode中也没有通过控制台的日志。

所以我的问题是......即使没有调用didReceiveMemoryWarning,这是一个内存问题吗?这是我的一些代码。

viewWillDisappear(ViewController)

- (void)viewWillDisappear:(BOOL)animated {
if (cameraFlashButton) { [cameraFlashButton release]; }
if (switchCamera) { [switchCamera release]; }
if (cameraBadgeBack) { [cameraBadgeBack release]; }
if (cameraBadgeNumber) { [cameraBadgeNumber release]; }
if (cameraUseButton) { [cameraUseButton release]; }
if (cameraOverlayView) { [cameraOverlayView release]; }
if (blackOverlay) { [blackOverlay release]; }
if (loadingIndicator) { [loadingIndicator release]; }
if (cameraPickButton) { [cameraPickButton release]; }
if (whiteOverlay) { [whiteOverlay release]; }
if (imageOverlay) { [imageOverlay release]; }
if (captureManager) { [captureManager release], captureManager = nil; }
if (theCaptureSession) { [theCaptureSession release], theCaptureSession = nil; }
[super viewWillDisappear:YES];
}

dealloc(CaptureSessionManager)

- (void)dealloc {
if ([self captureSession]) { [[self captureSession] stopRunning]; }
if (previewLayer) { [previewLayer release], previewLayer = nil; }
if (captureSession) { [captureSession release], captureSession = nil; }
if (stillImageOutput) { [stillImageOutput release], stillImageOutput = nil; }
if (stillImage) { [stillImage release], stillImage = nil; }
[super dealloc];
}

想法?如果你还需要看其他东西,请问!提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果didReceiveMemoryWarning已正确实施并且从未调用过,那么您的问题可能不是由于内存不足造成的。当您开始捕获会话运行时,还有许多其他方法可以导致崩溃。您需要发布更多的实现以及崩溃的详细信息,以帮助调试。

但是,您发布的代码存在许多效率低下和样式问题。在Objective-C消息中注意nil非常好。因此,在viewWillDisappeardealloc方法中,您可以并且应该删除每个if测试可读性。例如,而不是:

if (cameraFlashButton) { [cameraFlashButton release]; }

只需使用:

[cameraFlashButton release];

如果您使用的是合适的合成访问器,那么替换

之类的行也要好得多
if (previewLayer) { [previewLayer release], previewLayer = nil; }

只需

self.previewLayer = nil;