objective-c - 不理解 block 作用域给出的示例

标签 objective-c

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/

相关文章:

ios - 如何设置UICollectionViewCell大小

objective-c - 无法从 Swift 文件中的 Objective-C 文件获取正确的 indexPath.row 值

ios - 识别 iOS 10 中的隐私侵犯

iphone - iPhone 应用程序的套接字超时值

ios - 从日期字符串开始的 24 小时时间

objective-c - 我可以将 NSLog 包装在一个带有可变数量参数的 block 中吗?

ios - 如何在 iOS 应用程序中获取设备充电类型?

ios - 从类别调用方法在 iOS 7.1 中给出 "Unrecognised selector error",但在 8.4 中没问题

objective-c - SpriteKit 缺少线性变换矩阵

ios - 图层 maskToBounds 默认值不起作用