2012-04-29 2 views
0

以下のメソッドは、書籍Professional iOS拡張現実(Apress)のgithubレポジトリからのものです。クリーンアップ^ブロック

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

ユーザーがこのviewControllerを消失させる変更を行った場合はどうなりますか? ^ブロックがキューに保持されていることを理解しています。これは、(顔検出ルーチンが返ってきたとき)メッセージを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]; 
     });  
    }); 
} 

答えて

2

dispatch_async()ブロックを宣言スコープを超えて保持するため、ブロックをコピーします。ブロック内で参照されるすべてのオブジェクトは、コピー時に保持されます。したがって、あなたが参照しているviewControllerがselfであると仮定すると、nilにはなりません。それはブロックの寿命の間保持されます。

+0

これは、保持されているviewControllerのビューまたは他のプロパティも保持されていることを意味しますか?メモリリークや、もはや存在しないビューを参照しようとしているVCについて不思議だったので、私は尋ねます。 –

+0

ビューコントローラが他のオブジェクトを保持している場合(おそらくは 'strong'プロパティ付き)、それらは保持しているものと一緒に残っています。もちろん、ビューコントローラコードは' -didReceiveMemoryWarning '、そしてそれらは遠ざかるかもしれません。これは、標準参照カウントメモリ管理です。ブロックは最終的に解放され、それが保持しているものはすべて解放されるため、リークはありません。 –

+0

ok - 詳細な返信をありがとう! –