2

Apple ブロックのドキュメントには、記述しないコードの例があります。

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

コードのコメントによると、ブロック リテラル スコープは "then" 句です。それが何を意味するのか理解できません。then 句がありません。おそらく、それが引用符で囲まれている理由です。しかし、なぜ彼らはそれを引用符で囲んだのですか? ブロックのスコープとの関係は何ですか?

4

1 に答える 1

2

if ステートメントを次のように考えてください: if this then that else this other

{... 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();それが指しているブロックはもはや有効ではないスコープ内にあり、動作は未定義になります (実際の例ではクラッシュする可能性があります)。

于 2012-11-05T17:44:14.953 に答える