当快速点击按钮时,iPhone手电筒应用程序崩溃

时间:2011-01-21 04:50:51

标签: iphone avcapturesession avcapturedevice flashlight

我的flashligh应用程序运行完美。出于某种原因,每次我快速点击手电筒按钮,应用程序只是冻结,并没有做任何事情。当我调用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];
 }
}

3 个答案:

答案 0 :(得分:5)

你真的明白你上面粘贴的代码是什么,或者你是从其他地方复制过来的?

因为您正在做的是反复要求iOS创建一个视频捕获会话,然后打开灯。创建视频捕获会话非常占用CPU /内存。它从未被设计或打算用于快速使用 - 没有“正常”用例,用户将在几秒钟内尝试启动多个视频捕获会话。这就是你遇到崩溃的原因。

答案 1 :(得分:5)

以下是您现在可用于打开或关闭LED的较短版本:

- (void)torchOnOff: (BOOL) onOff
{
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    if ([device hasTorch]) {
        [device lockForConfiguration:nil];
        [device setTorchMode: onOff ? AVCaptureTorchModeOn : AVCaptureTorchModeOff];
        [device unlockForConfiguration];
    }
}

答案 2 :(得分:0)

如果你的应用程序围绕AVCaptureSession,你应该有一个AVCapture会话实例在应用程序的生命周期内运行,只需在该会话中切换火炬。你的事情太复杂了。 如上所述,不要继续重新创建相同的会话。这是浪费资源。我建议观看WWDC '10关于这个主题的视频,并查看演示项目。