The complexBlock variable refers to a block that takes another block as an argument (aBlock) and returns yet another block.
void (^( ^complexBlock )( void (^)(void) )) (void)
你看有几个^ 就表示有几个block
void (^)(void)
是block 做为complexBlock的参数
你可以记为 blockArg
void (^( ^complexBlock )( blockArg )) (void)
则
( ^complexBlock )( blockArg )
是block的名称和参数部分 记为 blockBody
void (^blockBody) (void)
这个 就是一个block的定义了
上面的意思是 blockBody的返回值是一个block 参数为void 返回值为void
这是一种C语言的定义方法 类似返回函数指针的函数指针... 就是这个样子..
其实这种写法是可读性非常差的.... 可以用typedef 先预定义block类型 会比较好
typedef void (^argBlock)(void);
typedef void (^returnBlock)(void);
其实文档里也说了 rewrite the code 类似如下
returnBlock (^complexBlock)(argBlock) = ^ (argBlock aBlock) {
...
return ^{
...
};
};
嗯,非常感谢,你的思路很清晰,我也看的差不多了,但还有几个细节需要请教下:
( ^complexBlock )( blockArg)
,是一个block,对于这点,我的疑问是可以用一个block来做另一个block的名字吗?如果可以,这个block ( ^complexBlock )( blockArg )
可以不需要申明返回类型吗?void (^blockBody) (void)
这个是整体的结构,可以看出返回值和参数都是void, 那函数体代码中的参数和返回值都是block,这点儿怎么理解呢?参考阅读: From C Declarators to Objective-C Blocks Syntax
记住里面提到的阅读申明的方法: when reading complex declarator, you always start from the identifier and go right as long as possible then go left when you reach either the end of the declarator or a closing parenthesis.
对于
void (^(^complexBlock)(void (^)(void)))(void)
1.首先要从complexBlock
开始,遵从先往右,后往左的原则,首先提取出来的信息就是:
(^complexBlock)
: 说明变量complexBlock
的类型是Block
2.在继续就是complexBlock
的参数
(^complexBlock)
(void (^)(void))
: 说明complexBlock
的参数是一个blockvoid (^)(void)
3.最后就是complexBlock
的返回值
void (^
(^complexBlock)(void (^)(void))
)(void)
:complexBlock
的返回值是一个blockvoid (^)(void)
PS: 生产环境中要是看到有人写这样的代码,请把他拖出去打一顿