理解用对象C编程的块

时间:2014-02-02 18:43:13

标签: ios objective-c objective-c-blocks

关于教程promgrammingWithObjectiveC。

following code让我感到困惑:

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

void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
    ...
    return ^{
        ...
    };
};

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

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

typedef void (^XYZSimpleBlock)(void);
XYZSimpleBlock (^betterBlock)(XYZSimpleBlock) = ^ (XYZSimpleBlock aBlock) {
    ...
    return ^{
        ...
    };
};

我的重写代码: enter image description here 但我无法理解源代码:

void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
    ...
    return ^{
        ...
    };
}

据我了解,它应该是:

(void (^) (void)) (^complexBlock) (void (^)(void) = ^ (void (^aBlock)(void)) {
    ...
    return ^{
        ...
    };
};

1 个答案:

答案 0 :(得分: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

更一般地说,有一种叫做的技术 "Clockwise/Spiral Rule" 您可以用它来“解析”C声明。螺旋规则有效 对于街区也是如此。

或使用cdecl C gibberish ↔ English中的your case 返回

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