5

AVCaptureフレームワークを使用して、カメラから写真を撮るときに点滅するフラッシュライトを設定しています。この方法では、数秒間フラッシュライトの点滅効果が得られますが、その後クラッシュします。

以下は私が行ったコードです。

-(IBAction) a
{
    _picker = [[UIImagePickerController alloc] init];
    _picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    _picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
    _picker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
    _picker.showsCameraControls = YES;
    _picker.navigationBarHidden =YES;
    _picker.toolbarHidden = YES;
    _picker.wantsFullScreenLayout = YES;

    [_picker takePicture];

    // Insert the overlay
    OverlayViewController *overlay = [[OverlayViewController alloc] initWithNibName:@"OverlayViewController" bundle:nil];
    overlay.pickerReference = _picker;
    _picker.cameraOverlayView = overlay.view;
    _picker.delegate = (id)self;

    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(flashLight_On_Off) userInfo:nil repeats:YES];

    [self presentModalViewController:_picker animated:NO];
}

- (void)flashLight_On_Off
{
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    for (AVCaptureDevice *device in devices)
    {
        if ([device hasFlash] == YES)
        {
            [device lockForConfiguration:nil];
            if (bulPicker == FALSE)
            {
                [device setTorchMode:AVCaptureTorchModeOn];
                bulPicker = TRUE;
            }
            else
            {
                [device setTorchMode:AVCaptureTorchModeOff];
                bulPicker = FALSE;
            }
            [device unlockForConfiguration];
        }

    }
}

何か問題ある?解決策を得るための他の方法はありますか?また、撮影後、使用ボタンを押す前にまばたきを止めなければなりません。

適切な解決策を提案してください。

4

1 に答える 1

5

Cocoaの命名規則を正しく思い出せば、を除くすべてのメソッド- alloc- copy- mutableCopy自動解放されたオブジェクトが返されます。この場合、

NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

1秒間に10回呼び出され、自動リリースされるたびに呼び出されます。これは、すぐにリリースされない可能性があることを意味します。そのため、RAMが使い果たされ始め、OSが最終的にこれを検出して、アプリのプロセスを強制終了します。

これらの操作が頻繁に呼び出されることが事前にわかっている場合は、これらの種類の操作を自動解放プールにラップする必要があります。

- (void)toggleFlashlight
{
    @autoreleasepool {
        NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
        for (AVCaptureDevice *device in devices)
        {
            if ([device hasFlash]) {
                [device lockForConfiguration:nil];
                if (bulPicker) {
                    [device setTorchMode:AVCaptureTorchModeOff];
                    bulPicker = NO;
                } else  {
                    [device setTorchMode:AVCaptureTorchModeOn];
                    bulPicker = YES;
                }
                [device unlockForConfiguration];
            }
        }
    }
}
于 2012-11-26T12:22:22.023 に答える