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

标签 objective-c ios objective-c-blocks

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/

相关文章:

ios - 您是否注意到 dispatch_after 在 iOS 设备上运行速度太慢了 ~10%?

ios 后台任务 - 解释执行顺序?

iphone - - (BOOL) 应用程序 :(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions was not triggered

ios - iOS swift 中控制百分比的堆栈 View 排列

iphone - "initialiser element is not a compile-time constant"创建 GCD 队列时

ios - 无法分配类型 '' [UIImage ]'? to type ' UIImage' (swif3)

ios - iPhone 和 iPad Storyboard需要多个 View Controller 吗?

ios - 将字符串转换为日期并查找时差

ios - 关闭自定义警报 View 和展开 segue 问题?

objective-c - 如何在 UIScrollView 中禁用垂直滚动(Obj-C)