objective-c - "__block"关键字是什么意思?

Objective-C 中的 __block 关键字究竟是什么意思?我知道它允许您修改 block 内的变量,但我想知道...

  1. 它究竟告诉编译器什么?
  2. 它还有其他作用吗?
  3. 如果仅此而已,那么为什么首先需要它?
  4. 它在任何地方的文档中吗? (我找不到)。

最佳答案

它告诉编译器任何被它标记的变量在 block 内使用时都必须以特殊方式处理。通常, block 中也使用的变量及其内容会被复制,因此对这些变量所做的任何修改都不会显示在 block 之外。当它们被标记为 __block 时,在 block 内所做的修改在 block 外也可见。

有关示例和更多信息,请参阅 The __block Storage Type在 Apple 的 Blocks Programming Topics 中。

重要的例子是这个:

extern NSInteger CounterGlobal;
static NSInteger CounterStatic;

{
    NSInteger localCounter = 42;
    __block char localCharacter;

    void (^aBlock)(void) = ^(void) {
        ++CounterGlobal;
        ++CounterStatic;
        CounterGlobal = localCounter; // localCounter fixed at block creation
        localCharacter = 'a'; // sets localCharacter in enclosing scope
    };

    ++localCounter; // unseen by the block
    localCharacter = 'b';

    aBlock(); // execute the block
    // localCharacter now 'a'
}

在此示例中,localCounterlocalCharacter 在调用 block 之前都已修改。然而,在 block 内部,只有对 localCharacter 的修改是可见的,这要归功于 __block 关键字。反之, block 可以修改localCharacter,而且这个修改在 block 外是可见的。

关于objective-c - "__block"关键字是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7080927/

相关文章:

objective-c - Objective-C 中的#import 和#include 有什么区

ios - @import 与 #import - iOS 7

ios - 文件是通用的(三个切片),但它不包含 iOS 上静态库的(n)ARMv7-s 切片错误,

ios - 如何隐藏 UINavigationBar 1px 底线

ios - 应用程序在应用程序启动结束时应该有一个 Root View Controller

c - 是否可以使用 NSLog C 结构(如 CGRect 或 CGPoint)?

objective-c - 在objective-c/cocoa中抛出异常

ios - 在 iOS 中获取当前设备语言?

objective-c - 关闭键盘的简单方法?

objective-c - 比较浮点值有多危险?