Apple block 文档中有一个不要编写的代码示例:
void dontDoThisEither() {
void (^block) (void);
int i = random();
if (i > 1000) {
block = ^{printf("got i at: %d\n", i); };
}
// ...
}
代码的注释表明 block 文字范围是“then”子句。 我不明白他们的意思,没有 then 子句,这可能就是他们将其放在引号中的原因。但为什么他们要把它放在引号中以及与 block 的范围有什么关系?
最佳答案
将 if 语句视为: 如果这个 那么 其他 其他事情
{... block = ...}
位于 if
语句的 then that 部分。也就是说,它是 *dontDoThisEither() 函数作用域的子作用域。
因为 block 是在堆栈上创建的,并且仅在其声明的范围内有效,这意味着该示例中的 block 赋值仅在 then 的范围内有效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();
时,它指向的 block 位于不再有效的范围内,并且行为将是未定义的(并且在现实世界的示例中可能会崩溃) )。
关于objective-c - 不理解 block 作用域给出的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13237304/