AVCaptureSession stopRunning() 神秘崩溃
AVCaptureSession stopRunning() Mysterious Crash
最近我收到了来自 firebase 的崩溃通知,消息如下:
[AVCaptureSession stopRunning] stopRunning may not be called between calls to beginConfiguration and commitConfiguration
我检查了我的代码,最奇怪的是我从来没有打电话,也没有提到 beginConfiguration()
和 commitConfiguration()
。
在我的 CameraManager
class 中,这是触发崩溃的函数,它调用了 deinit:
func stop() {
guard isStarted else { return Log.w("CameraManager wasn't started") }
queue.async {
self.isStarted = false
self.isCapturingFrame = false
self.isCapturingCode = false
self.session?.stopRunning()
self.session = nil
self.device = nil
}
notificationCenter.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
layer.removeFromSuperlayer()
layer.session = nil
}
queue
只是一个串行调度队列。
无论我尝试什么,我都无法重现这次崩溃。
尝试拉菜单、推送通知、phone 调用、模拟内存警告等...
澄清一下,我的代码中没有一个地方调用 beginConfiguration
和 commitConfiguration
.
我可以想象 layer.session = nil
会导致捕获会话的重新配置(因为与预览层的连接已删除)。由于您正在调用 stopRunning()
异步,我想您可以 运行 进入竞争条件,其中 stopRunning()
在配置更改的中间被调用。
我建议您要么尝试使清理调用同步(queue.sync { ... }
),要么将层清理也移到 async
块中。
最近我收到了来自 firebase 的崩溃通知,消息如下:
[AVCaptureSession stopRunning] stopRunning may not be called between calls to beginConfiguration and commitConfiguration
我检查了我的代码,最奇怪的是我从来没有打电话,也没有提到 beginConfiguration()
和 commitConfiguration()
。
在我的 CameraManager
class 中,这是触发崩溃的函数,它调用了 deinit:
func stop() {
guard isStarted else { return Log.w("CameraManager wasn't started") }
queue.async {
self.isStarted = false
self.isCapturingFrame = false
self.isCapturingCode = false
self.session?.stopRunning()
self.session = nil
self.device = nil
}
notificationCenter.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
layer.removeFromSuperlayer()
layer.session = nil
}
queue
只是一个串行调度队列。
无论我尝试什么,我都无法重现这次崩溃。
尝试拉菜单、推送通知、phone 调用、模拟内存警告等...
澄清一下,我的代码中没有一个地方调用 beginConfiguration
和 commitConfiguration
.
我可以想象 layer.session = nil
会导致捕获会话的重新配置(因为与预览层的连接已删除)。由于您正在调用 stopRunning()
异步,我想您可以 运行 进入竞争条件,其中 stopRunning()
在配置更改的中间被调用。
我建议您要么尝试使清理调用同步(queue.sync { ... }
),要么将层清理也移到 async
块中。