Objective-C 中的 __block
关键字究竟是什么意思?我知道它允许您修改 block 内的变量,但我想知道...
- 它究竟告诉编译器什么?
- 它还有其他作用吗?
- 如果仅此而已,那么为什么首先需要它?
- 它在任何地方的文档中吗? (我找不到)。
最佳答案
它告诉编译器任何被它标记的变量在 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'
}
在此示例中,localCounter
和 localCharacter
在调用 block 之前都已修改。然而,在 block 内部,只有对 localCharacter
的修改是可见的,这要归功于 __block
关键字。反之, block 可以修改localCharacter
,而且这个修改在 block 外是可见的。
关于objective-c - "__block"关键字是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7080927/