快速点击按钮时 iPhone 手电筒应用程序崩溃
我的手电筒应用程序完美运行。但出于某种原因,每次我非常快地点击手电筒按钮时,该应用程序就会冻结并且不执行任何操作。当我调用 AVCaptureSession stopRunning 时,它似乎冻结了。这是我的切换手电筒方法的代码。我还希望最终为选通功能调用此方法。
- (void)toggleFlashlight{
if (isTorchOn) {
// Start session configuration
[session beginConfiguration];
[device lockForConfiguration:nil];
// Set torch to on
[device setTorchMode:AVCaptureTorchModeOn];
[device unlockForConfiguration];
[session commitConfiguration];
[session startRunning];
}
else {
[session stopRunning];
[session release];
session = nil;
session = [[AVCaptureSession alloc] init];
// Create device input and add to current session
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error: nil];
[session addInput:input];
// Create video output and add to current session
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[session addOutput:output];
[output release];
}
}
I got my flashligh app working perfectly. For some reason tho, everytime i tap on the flashlight button really fast, the app just freezes and doesnt do anything. It seems that its freezing when i call the AVCaptureSession stopRunning. Heres the code for my toggle flashlight method. I also want this method to eventually be called for a strobe feature.
- (void)toggleFlashlight{
if (isTorchOn) {
// Start session configuration
[session beginConfiguration];
[device lockForConfiguration:nil];
// Set torch to on
[device setTorchMode:AVCaptureTorchModeOn];
[device unlockForConfiguration];
[session commitConfiguration];
[session startRunning];
}
else {
[session stopRunning];
[session release];
session = nil;
session = [[AVCaptureSession alloc] init];
// Create device input and add to current session
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error: nil];
[session addInput:input];
// Create video output and add to current session
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[session addOutput:output];
[output release];
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您真的了解上面粘贴的代码的作用吗,还是从其他地方复制的?
因为您所做的就是反复要求 iOS 创建视频捕获会话,然后将灯打开。创建视频捕获会话需要大量 CPU/内存。它从来没有被设计或打算快速使用 - 不存在用户尝试在几秒钟内启动多个视频捕获会话的“正常”用例。这就是你崩溃的原因。
Do you actually understand what the code you've pasted above does, or did you copy it from somewhere else?
Because what you're doing is repeatedly asking iOS to create a video capture session, which then turns the light on. Creating a video capture session is very CPU/memory intensive. It was never designed or intended to be used rapidly - there's no 'normal' use-case in which a user would attempt to initiate multiple video capture sessions within seconds of each other. That's why you're getting your crashes.
这是一个较短的版本,您现在可以使用它来打开或关闭 LED:
Here is a shorter version you can now use to turn the LED on or off:
如果您的应用程序围绕 AVCaptureSession 展开,则您应该在应用程序的生命周期内运行一个 AVCapture 会话实例,并且只需在该会话中切换火炬即可。你把事情搞得太复杂了。
如前所述,不要继续重新创建同一个会话。这是资源的浪费。我建议观看有关该主题的 WWDC '10 视频并浏览演示项目。
If your app revolves around AVCaptureSession, you should have one instance of AVCapture session running for the life of the app and simply toggle the torch in that session. You're over complicating things.
As mentioned, do NOT keep recreating the same session. This is a waste of resources. I recommend watching the WWDC '10 videos on the subject and looking through the Demo projects.