理解用对象C编程的块

rua*_*dao 2 objective-c ios objective-c-blocks

关于教程promgrammingWithObjectiveC.

下面的代码让我迷惑:

在处理返回块或将其他块作为参数的块时,自定义类型定义特别有用.请考虑以下示例:

void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
    ...
    return ^{
        ...
    };
};
Run Code Online (Sandbox Code Playgroud)

complexBlock变量引用一个块,该块将另一个块作为参数(aBlock)并返回另一个块.

重写代码以使用类型定义使这更具可读性:

typedef void (^XYZSimpleBlock)(void);
XYZSimpleBlock (^betterBlock)(XYZSimpleBlock) = ^ (XYZSimpleBlock aBlock) {
    ...
    return ^{
        ...
    };
};
Run Code Online (Sandbox Code Playgroud)

我的重写代码: 在此输入图像描述 但我无法理解源代码:

void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
    ...
    return ^{
        ...
    };
}
Run Code Online (Sandbox Code Playgroud)

据我所知,它应该是:

(void (^) (void)) (^complexBlock) (void (^)(void) = ^ (void (^aBlock)(void)) {
    ...
    return ^{
        ...
    };
};
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 5

使用类似于用于声明指向函数的指针的语法来声明块,除了您使用^而不是*.

因此函数analogon将是"指向返回函数指针的函数的指针",这里有很好的解释:https://stackoverflow.com/a/10759352/1187415.

如果您将该答案的"构建过程"翻译为您的块,那么您将得到:

         complexBlock                          -- complexBlock
        ^complexBlock                          -- is a block
       (^complexBlock)(void (^)(void))         --   taking a block parameter
      ^(^complexBlock)(void (^)(void))         --   returning a block
     (^(^complexBlock)(void (^)(void)))(void)  --     taking no parameters
void (^(^complexBlock)(void (^)(void)))(void)  --     returning void

更一般地说,有一种称为 "顺时针/螺旋规则"的技术 ,您可以使用它来"解析"C声明.螺旋规则也适用于块.

或者使用cdecl Cgibberish↔English,在您的情况下 返回

declare complexBlock as block (block (void) returning void) returning
block (void) returning void