3
void(^block)()  = ^() {double a=0;
}; //works

void(^block)()  = ^() {double a=0;
}.copy //won't works;

void(^block)()  = (^() {double a=0;
}).copy //this one surprisingly works actually

void(^block)()  = ^() {double a=0;
};
block=block.copy //works but 2 lines

这个问题是出于简单的好奇

原来

void(^block)()  = (^() {double a=0;
}).copy works.

奇怪的是

block=block.copy不工作,但block=[block copy]工作。我想知道为什么

我只是想定义一个块并立即复制它。就像是:

NSArray * array = [NSArray array].copy;

看,那里不需要括号。

array=array.copy 也可以正常工作。

4

1 回答 1

2

我认为这种混淆确实源于在你不应该使用点符号的地方。

void(^block)() = ^ {double a=0;}.copy // does not work

这不会编译,因为.copy被解释为访问该名称的结构字段。因此 Xcode 编译错误:“成员引用基类型……不是结构或联合”。(编辑代码片段间距以证明这一点。)

现在考虑您的括号替代方案:

void(^block)() = (^{double a=0;}).copy //this one surprisingly works actually

当你认为编译器现在理解你的意图时,这并不奇怪——这要归功于括号。

于 2013-04-24T08:30:00.667 回答