块声明的结构

时间:2012-11-09 10:45:15

标签: objective-c objective-c-blocks

在声明block时,使用这种语法背后的理由是什么(左边是括号和插入符号)?

(^myBlock) 

例如:

int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};

2 个答案:

答案 0 :(得分:2)

C BLOCKS:语法和用法

指向块的变量采用与指向函数的变量完全相同的语法,除了*替换为^。例如,这是一个函数指针,该函数指向一个带有int并返回float的函数:

float (*myfuncptr)(int);

这是一个块指针,指向一个接受int并返回float的块:

float (^myblockptr)(int);

与函数指针一样,您可能希望键入dede这些类型,否则会变得相对毛茸茸。例如,指向块返回块的块的指针将类似于void (^(^myblockptr)(void (^)()))();,这几乎不可能被读取。一个简单的typedef后来,它更简单:

typedef void (^Block)();
Block (^myblockptr)(Block);

声明块本身是我们进入未知的地方,因为它看起来并不像C,尽管它们类似于函数声明。让我们从基础开始:

myvar1 = ^ returntype (type arg1, type arg2, and so on) {
    block contents;
    like in a function;
    return returnvalue;
};

这定义了一个块文字(来自after = to和includes}),显式提到它的返回类型,参数列表,块体,return语句,并将这个文字赋给变量myvar1。

文字是可以在编译时构建的值。整数文字(int a = 3中的3;)和字符串文字(const char *中的“foobar”* b =“foobar”;)是文字的其他示例。当我们进入内存管理时,块声明是文字的这一事实很重要。

在像这样的块中查找返回语句对某些人来说很烦人。你可能会问,它是否从封闭功能返回?不,它返回一个可以由块的调用者使用的值。请参阅“调用块”。注意:如果块有多个return语句,则它们必须返回相同的类型。

最后,块声明的某些部分是可选的。这些是:

  • 参数列表。如果块不带参数,则可以完全跳过参数列表。

示例:

myblock1 = ^ int (void) { return 3; }; // may be written as:
myblock2 = ^ int { return 3; }
  • 返回类型。如果块没有return语句,则假定为void。如果块具有return语句,则从中推断返回类型。这意味着您几乎总是可以从声明中跳过返回类型,除非它可能是不明确的。

示例:

myblock3 = ^ void { printf("Hello.\n"); }; // may be written as:
myblock4 = ^ { printf("Hello.\n"); };

// Both succeed ONLY if myblock5 and myblock6 are of type int(^)(void)
myblock5 = ^ int { return 3; }; // can be written as:
myblock6 = ^ { return 3; };

来源:http://thirdcog.eu/pwcblocks/

答案 1 :(得分:1)

认为的理由是它看起来像一个函数指针:

void (*foo)(int);

任何C程序员都应该熟悉。