不明白给出的块范围示例

  • 本文关键字:范围 明白 objective-c
  • 更新时间 :
  • 英文 :


在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();时,它指向的块是在不再有效的范围内,并且行为将不确定(并且在现实世界中可能发生崩溃)。

最新更新