2

以下のコードとして NSInvocation を使用して NSTimer を処理するアプリを開発しています。次のコードで Sigbart エラーが発生しています*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSInvocation invocationWithMethodSignature:]: method signature argument cannot be nil' *** First throw call stack

このクラッシュを特定しようとしていますが、取得できませんでした。誰かがこれを解決するのを手伝ってくれますか?

コード:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveImageToPhotoAlbum) name:kImageCapturedSuccessfully object:nil];

    NSInvocation *myInvocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(capturePicture:)]];
    [myInvocation setSelector:@selector(capturePicture:)];
    [myInvocation setTarget:self];
    [myInvocation retainArguments];

    [NSTimer scheduledTimerWithTimeInterval:5.0 invocation:myInvocation repeats:NO];




   -(void) capturePicture :(id) sender
{
    NSLog(@"capTureAutoPicture:Scanning image at interval");

    // Get all cameras in the application and find the frontal camera.
    AVCaptureDevice *backCamera;
    NSArray *allCameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

    // Find the back camera.
    for ( int i = 0; i < allCameras.count; i++ ) {
        AVCaptureDevice *camera = [allCameras objectAtIndex:i];

        if ( camera.position == AVCaptureDevicePositionBack ) {
            backCamera = camera;
        }
    }

    // If we did not find the camera then do not take picture.
    if ( backCamera != nil ) {
        // Start the process of getting a picture.
        AVCaptureSession *session = [[AVCaptureSession alloc] init];

        // Setup instance of input with back camera and add to session.
        NSError *error;
        AVCaptureDeviceInput *input =
        [AVCaptureDeviceInput deviceInputWithDevice:backCamera error:&error];

        if ( !error && [session canAddInput:input] ) {
            // Add frontal camera to this session.
            [session addInput:input];

            // We need to capture still image.
            AVCaptureStillImageOutput *output = [[AVCaptureStillImageOutput alloc] init];

            // Captured image. settings.
            [output setOutputSettings:
             [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil]];

            if ( [session canAddOutput:output] ) 
            {

                [session addOutput:output];

                AVCaptureConnection *videoConnection = nil;
                for (AVCaptureConnection *connection in output.connections) {
                    for (AVCaptureInputPort *port in [connection inputPorts]) {
                        if ( [[port mediaType] isEqual:AVMediaTypeVideo] ) 
                        {
                            videoConnection = connection;
                            break;
                        }
                    }
                    if (videoConnection) 
                    { 
                        break; 
                    }
                }

                // Finally take the picture
                if ( videoConnection ) 
                {
                    [session startRunning];

                    [output captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
                     {
                         if (imageDataSampleBuffer != NULL) 
                         {
                             NSData *imageData = [AVCaptureStillImageOutput 
                                                  jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
                             UIImage *photo = [[UIImage alloc] initWithData:imageData];

                             //UIImageWriteToSavedPhotosAlbum(photo, nil, nil, nil);
                             [photo release];

                             [[NSNotificationCenter defaultCenter] postNotificationName:kImageCapturedSuccessfully object:nil];

                             [session stopRunning];

                         }

                     }];

                }
            }
            [output release];
        }
    }
}
- (void)saveImageToPhotoAlbum
{
    UIImageWriteToSavedPhotosAlbum([self stillImage], self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

    [self dismissModalViewControllerAnimated:YES];
}

更新されたコード:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveImageToPhotoAlbum) name:kImageCapturedSuccessfully object:nil];

    /*NSInvocation *myInvocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(capTureAutoPicture)]];
    [myInvocation setSelector:@selector(capTureAutoPicture)];
    [myInvocation setTarget:self];
    [NSTimer scheduledTimerWithTimeInterval:5.0 invocation:myInvocation repeats:NO];*/

    [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(capTureAutoPicture:) userInfo:nil repeats:NO];
4

2 に答える 2

2

スローされた例外は、引数が nil であってはならないことは明らかです。

以下は NSInvocation の実例です。

NSMethodSignature *methodSignature = [[_filter class] instanceMethodSignatureForSelector:@selector()];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[invocation setTarget:_filter];
[invocation setSelector:selector];
[invocation setArgument:&value atIndex:2];
[invocation invoke];

また、NSInvocation がどのように機能するかを非常によく説明しているこの質問への回答をご覧になることをお勧めします。

于 2013-01-15T20:31:09.093 に答える
0

それを私が直した。問題は、「didFinishSavingWithError」を追加せずに呼び出したことです。この定義を追加した後、それは機能しました。

于 2013-01-16T05:27:57.467 に答える