在Apple块文档中是一个不写的代码示例:
void dontDoThisEither() {
void (^block) (void);
int i = random();
if (i > 1000) {
block = ^{printf("got i at: %d\n", i); };
}
// ...
}
代码的注释表示块文字范围是“then”子句。 我不明白他们的意思是什么,没有当时的条款,这可能是为什么他们把它放在引号中。但为什么他们把它放在引号中,与块的范围有什么关系呢?
答案 0 :(得分:2)
将if语句视为: if this 那么 else 另一件事
{... block = ...}
位于if
语句的然后部分。也就是说,它是* dontDoThisEither()
函数范围的子范围。
因为块是在堆栈上创建的,并且仅在其声明的范围内有效,这意味着该示例中的块赋值仅在然后范围内有效。 if
声明。
即。考虑:
void dontDoThisEither() {
void (^block) (void);
int i = random();
if (i > 1000) {
block = ^{printf("got i at: %d\n", i); };
} else {
block = ^{printf("your number is weak and small. ignored.\n");};
}
block();
}
在执行block();
时,它所指向的块位于不再有效的范围内,并且行为将是未定义的(并且在实际示例中可能会崩溃)。