0

以下の方法は、Professional iOS Augmented Reality book (Apress)のgithubリポジトリからのものです。

UIViewController全体的なベースの例には、クリーンアップを扱うコードはありません。ここで呼び出された CoreImage の顔検出ルーチンが完了するまでに数秒かかる場合があります。

ユーザーが変更を行った結果、この viewController が消えた場合はどうなりますか? ^block がキューによって保持されていることは理解しています。これは、(顔検出ルーチンが戻ったときに) nil にメッセージを送信することが実際にメリットがある場合ですか?

- (IBAction)detectFacialFeatures:(id)sender {

    self.detectingView.hidden = NO;
    self.scrollView.scrollEnabled = NO;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        CIImage *image = [[CIImage alloc] initWithImage:[FACE_IMAGES objectAtIndex:self.currentIndex]];

        NSString *accuracy = self.useHighAccuracy ? CIDetectorAccuracyHigh : CIDetectorAccuracyLow;
        NSDictionary *options = [NSDictionary dictionaryWithObject:accuracy forKey:CIDetectorAccuracy];
        CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:options];

        NSArray *features = [detector featuresInImage:image];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self drawImageAnnotatedWithFeatures:features];
        });    
    });
}
4

1 に答える 1

2

dispatch_async()ブロックを宣言範囲外に保持するため、ブロックをコピーします。ブロック内で参照されているすべてのオブジェクトは、コピー時に保持されます。したがって、参照しているviewControllerが であると仮定すると、そうselfではありませんnil。ブロックの存続期間中保持されます。

于 2012-04-29T19:55:34.257 に答える