到底是什么__blockObjective-C中的关键字表示?我知道它可以使您修改块内的变量,但我想知道…

  1. 它到底告诉编译器什么?
  2. 它还有其他事情吗?
  3. 如果这就是全部,那么为什么首先需要它?
  4. 在任何地方的文档中吗?(我找不到)。

答案

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

有关示例和更多信息,请参阅__block 存储类型在苹果的阻止编程主题

重要的例子是:

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在调用块之前进行修改。但是,在块内,只有修改localCharacter可以看到,多亏了__block关键词。相反,块可以修改localCharacter并且这种修改在块之外是可见的。

来自: stackoverflow.com