如何在block-c中传递block作为宏的参数?

时间:2013-10-01 06:02:46

标签: objective-c-blocks

在我的代码中,我有很多代码,如:

if (block) block(....)

所以我想定义一个宏,比如

#define safetyCall(block, ...) if((block)) {block(##__VA_ARGS__)};

但我无法让它发挥作用。有什么想法吗?

2 个答案:

答案 0 :(得分:6)

您不需要移动##;

#define safetyCall(block, ...) if((block)) { block(__VA_ARGS__); }

答案 1 :(得分:2)

如果您的块是内联的并且包含具有一系列逗号分隔字符串的代码等,则会遇到问题。

示例:

safetyCall(^void() {
  NSArray *foo = @[@"alice", "bob"];
};

编译器会抱怨“预期']'或'。'”和“预期标识符或'('”。

但是,如果要在宏之前将内联块声明为单独的块,则不会生成错误。

示例:

void (^fooBlock)(void) = ^void() {
  NSArray *foo = @[@"alice", @"bob"];
}

safetyCall(fooBlock);