在Apple Block文档中是一个不写的代码的示例:
void dontDoThisEither() {
void (^block) (void);
int i = random();
if (i > 1000) {
block = ^{printf("got i at: %dn", i); };
}
// ...
}
代码的评论说块字面范围是"然后"子句。我不明白这是什么意思,没有该条款,这大概是为什么他们将其引用的原因。但是,他们为什么将其引用,与块的范围有什么关系?
将if语句视为: 如果 this ,那么 else 因为块在堆栈上创建,并且仅在其声明范围内有效,这意味着该示例中的块分配仅在中有效,然后是的范围 即。考虑: 在执行{... block = ...}
在中,然后在if
语句的一部分中。也就是说,它是 dontDoThisEither()
函数范围的子范围。if
语句。void dontDoThisEither() {
void (^block) (void);
int i = random();
if (i > 1000) {
block = ^{printf("got i at: %dn", i); };
} else {
block = ^{printf("your number is weak and small. ignored.n");};
}
block();
}
block();
时,它指向的块是在不再有效的范围内,并且行为将不确定(并且在现实世界中可能发生崩溃)。