在方法调用中的插入符号

时间:2013-12-22 14:21:25

标签: ios objective-c

我正在阅读本教程并遇到了这行代码,这让我很难过:

[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {
    if (!error) {
        int i = 0;
        do {
            MKMapItem *mapItem = [response.mapItems objectAtIndex:i];
            [self.mapItems addObject:mapItem];
            i++;
        } while (i < response.mapItems.count);
        [[NSNotificationCenter defaultCenter] postNotificationName:@"Address Found" object:self];
    } else {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"Not Found" object:self];
    }
}];

我不理解的部分如下:^(MKLocalSearchResponse *response, NSError *error) {

那个插入符号^以及之后发生的事情是我不知道的。

我查看了一些文档但找不到任何内容。

2 个答案:

答案 0 :(得分:5)

^ 表示目标c中的。它就像一个匿名函数,可以分配给变量或作为参数传递给函数,如示例所示。阅读Apple文档中的更多内容:

https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html

定义一个块:

 ^{
     NSLog(@"This is a block");
}

将一个块分配给变量:

void (^simpleBlock)(void);

// or

simpleBlock = ^{
    NSLog(@"This is a block");
};

拨打电话:

simpleBlock();

使用块作为消息的参数:

- (IBAction)fetchRemoteInformation:(id)sender {
    [self showProgressIndicator];

    XYZWebTask *task = ...

    [task beginTaskWithCallbackBlock:^{
        [self hideProgressIndicator];
    }];
}

示例来自Apple文档

答案 1 :(得分:3)

^表示 - 一组可以像变量一样传递的代码。

在你的例子中:

^(MKLocalSearchResponse *response, NSError *error) { ... }
  |---------------------------------------------|   |---|
     Arguments (you can use these in the block)       ^ Code goes here

由于您使用的是完成处理程序,因此您的块不会向其调用者返回任何内容。在完成搜索时,MapKit搜索东西调用该块中的所有代码。

有一篇来自Apple的关于这个主题here的好文件。