Objective-C代码中^字符的含义是什么?

时间:2011-06-09 00:42:59

标签: objective-c objective-c-blocks

对我而言,这是相当多的代码。我理解每个代码部分的部分,但是我无法描述它如何挂起并作为一个整体起作用的逻辑流程,从completionHandler:方法之后的'^'字符的解释开始。

我可以在这里寻求一些帮助,以较低效的形式重新编写此代码,但效率较低但在视觉上更容易理解?我下载了这段代码,我可以说在程序的上下文中,它是工作代码。

感谢。

[[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];

}];

3 个答案:

答案 0 :(得分:7)

^符号表示块的开头。基本上它正在做的是在方法^{完成之前不会调用块内的代码(从}captureStillImageAsynchronouslyFromConnection)。一旦方法完成捕获图像,它就会执行块内的方法。使用块在Mac和Mac中相对较新。 iPhone世界,但它们可以从许多混乱的委托方法中拯救你,并且通常很棒。起初他们可能看起来令人生畏,但你会很快学会爱他们。

答案 1 :(得分:3)

  

使用^运算符声明一个   阻止变量并指示   块文字的开头。身体   块本身包含在内   在{}内,如本例所示   (和C一样,表示结束   声明):

您可以在iOS开发人员库的Blocks Programming Topics阅读更多内容。

答案 2 :(得分:1)

表示阻止。当我正在编辑这个答案的时候,我会给我关于积木的文章添加一个链接,这绝对是“傻瓜”...... http://compileyouidontevenknowyou.blogspot.com/2010/07/blocks-in-objective-c.html

  • 基本上captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:captureStillImageEtc,让我们说)接受代码块作为完成处理程序。

  • 此代码将由captureStillImageEtc方法执行,并将运行大括号({})之间定义的代码。

  • 您会注意到代码会对两个变量imageSampleBuffererror起作用。块签名定义了当captureStillImageEtc想要运行块时要传递这些内容(重复,花括号中的代码)。

注意:我可能会因此而被投票,但是对于大多数意图和目的来说,块很像指向匿名(或命名)函数的指针。