嵌套块编程

时间:2011-10-20 20:41:35

标签: objective-c objective-c-blocks

根据这个块编程教程:

http://thirdcog.eu/pwcblocks/

以下嵌套块:

void (^(^myblockptr)(void (^)()))();

指向块的指针返回一个块的块

它说它等同于:

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

我猜(void (^)())对应于参数,即(Block)。但是,我无法看到嵌套表达式的哪个部分对应于返回的块。

您是否能够在嵌套表达式中识别返回的块?

2 个答案:

答案 0 :(得分:7)

正如约书亚所说,在分析C声明时,从内到外开始是一个好主意。

void (^(^myblockptr)(void (^)()))();

由于myblockptr是变量,让我们将声明拆分为两部分,变量的左侧和变量的右侧:

void (^(^myblockptr)    (void (^)()))();

我们知道由于(^myblockptr) ^是一个块,所以在它的左边我们应该找到它的返回类型,在它的右边我们应该找到它的参数类型。

让我们分析myblockptr所采用的参数,向右移动。它们应该在(^myblockptr)

之后的括号中分组
void (^(^myblockptr)    (void (^)())    )();

这是一个单独的参数,因为^

是一个块
void (^)()

现在很容易看到该参数是一个返回void且不带参数的块。

向右移动,有一个右括号,所以我们需要分析最左边的部分:

void (^    (^myblockptr)…

我们看到myblockptr返回一个返回void的块。因为它返回一个块,所以我们应该找到返回块之后接受的参数类型,这个参数类型与最左边的开始paranthesis匹配:

void (^    (^myblockptr)(void (^)())    )();

因为它是(),我们看到返回的块没有任何参数。

http://f.cl.ly/items/0N3l000g0X2f1O0F2B0n/blocks.png

总结:myblockptr是一个块(右侧)接受一个块的参数,该块不带参数并返回void 和(左侧) )返回一个不带参数的块并返回void 。由于返回类型myblockptr和(单个)参数类型相同:

typedef void (^Block)();

导致:

Block (^myblockptr)(Block);

您可能需要阅读Steve’s Reading C type declarations,并且正如Jeremy所提到的,Fish’s cdecl.org

答案 1 :(得分:2)

您应该从里到外阅读块定义。

让我们分解。

void (^(^myblockptr)(void (^)()))();

void (^)()声明一个参数块

RETURNTYPE (^myblockptr)(PARAMS)使用params

声明一个名为myblockptr的块

和外部void(^(....)())指的是块中的返回类型。

将它们放在一起可以获得原始声明。