不理解块范围给出的示例

时间:2012-11-05 17:31:38

标签: objective-c

在Apple块文档中是一个不写的代码示例:

void dontDoThisEither() {
  void (^block) (void);
  int i = random();
  if (i > 1000) {
    block = ^{printf("got i at: %d\n", i); };
  }
  // ...
}

代码的注释表示块文字范围是“then”子句。 我不明白他们的意思是什么,没有当时的条款,这可能是为什么他们把它放在引号中。但为什么他们把它放在引号中,与块的范围有什么关系呢?

1 个答案:

答案 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();时,它所指向的块位于不再有效的范围内,并且行为将是未定义的(并且在实际示例中可能会崩溃)。