2011-06-09 13 views
4

私にとっては、これは非常にコードの一口です。私は各コード部分の部分を理解していますが、どのように一緒にハングアップし、全体として動作するのかについての論理的な流れは記述できません。completionHandler:メソッドの後の '^'文字の解釈から始めます。Objective-Cコードの^文字の意味は何ですか?

このコードをあまり圧縮されていない形式で書き直すと、あまり効率的ではありませんが、視覚的に理解しやすくなります。私はこのコードをダウンロードしたので、プログラムの文脈では、それはコードを実行していると述べることができます。

ありがとうございました。

[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:videoConnection 
completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { 

CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer, 
            kCGImagePropertyExifDictionary, NULL); 

if (exifAttachments) { 
    NSLog(@"attachements: %@", exifAttachments); 
} 
else { 
    NSLog(@"no attachments"); 
} 

NSData *imageData = [AVCaptureStillImageOutput 
        jpegStillImageNSDataRepresentation:imageSampleBuffer];  

UIImage *image = [[UIImage alloc] initWithData:imageData]; 
[self setStillImage:image]; 

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

}]; 
+4

これはブロックの開始を知らせます。 –

+3

@ sudo、回答を投稿... –

答えて

7

^シンボルはブロックの開始点です。基本的には、ブロックから}までのコードは、captureStillImageAsynchronouslyFromConnectionメソッドが完了するまで呼び出されません。メソッドがイメージのキャプチャを終了すると、ブロック内のメソッドが実行されます。ブロックを使用することは、Macの& iPhoneの世界では比較的新しいですが、面倒なデリゲートメソッドの多くからあなたを救うことができ、一般的に使用するには素晴らしいです。最初は彼らは気が散っているように思えるかもしれませんが、あなたはすぐにそれらを愛することを学ぶでしょう。

+0

+1これを回答するために。 –

+0

ありがとう! :) –

+0

非常にクリア、ありがとう! +1 – Ric

1

これはブロックに信号を送ります。私はこの答えを編集していますが、私は「ダミーのための」間違いである、ブロック上の私の記事へのリンクを出してあげる... http://compileyouidontevenknowyou.blogspot.com/2010/07/blocks-in-objective-c.html

  • 基本的にcaptureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:は(captureStillImageEtc、のは言わせて)、コードブロックを受け入れます完了ハンドラとして。

  • このコードはcaptureStillImageEtcメソッドで実行され、中括弧({})で定義されているコードが実行されます。

  • コードは2つの変数imageSampleBuffererrorに作用することに注意してください。ブロックシグネチャは、captureStillImageEtcがブロックを実行したいときに渡す必要があることを定義します(中括弧内のコードを繰り返します)。

:私はこのためにdownvotedてしまうかもしれませんが、ブロックがあり、ほとんどの意図や目的のために、匿名(または名前付き)関数へのポインタのようにたくさん。あなたは ブロック変数を宣言すると、リテラルブロックの 始まりを示すために、^演算子を使用

3

。この例 に示すように、ブロック自体の本体 は(Cでいつものように、;エンドステートメントの を示す)、{}内 が含まれる:

あなたにBlocks Programming Topicsで詳細を読むことができiOSデベロッパーライブラリ

関連する問題