【问题标题】:AVCaptureSession "startRunning" crashAVCaptureSession“startRunning”崩溃
【发布时间】:2012-07-06 04:25:54
【问题描述】:

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

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

viewWillDisappear(视图控制器)

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

想法?如果您需要查看其他内容,请询问!提前致谢。

【问题讨论】:

    标签: objective-c memory-management avfoundation avcapturesession


    【解决方案1】:

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

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

    if (cameraFlashButton) { [cameraFlashButton release]; }
    

    只需使用:

    [cameraFlashButton release];
    

    如果您使用的是正确合成的访问器,那么替换如下行会更好

    if (previewLayer) { [previewLayer release], previewLayer = nil; }
    

    简单

    self.previewLayer = nil;
    

    【讨论】:

    • 经过一番折腾,我发现了问题所在。显然这是一个内存问题,但我通过将分辨率更改为较低的质量来快速修复它,它的性能比以往任何时候都快。
    • 你会上传回答你做了什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多