1. ホーム
  2. objective-c

[解決済み] ブロック(__block)」というキーワードはどういう意味ですか?

2022-03-20 07:04:38

質問

具体的にどのような __block のキーワードはどういう意味ですか?ブロック内の変数を変更できるのは知っているのですが、知りたいのです...。

  1. 具体的にコンパイラに何を伝えるのですか?
  2. 他に何かすることはありますか?
  3. それだけなら、そもそもなぜ必要なのでしょうか?
  4. どこかにドキュメントがあるのでしょうか?(見つからない)。

解決方法は?

これは、このマークが付いた変数がブロック内で使用される場合、特別な方法で扱われなければならないことをコンパイラに伝えるものです。通常、ブロック内で使用される変数とその内容はコピーされるため、これらの変数に加えられた変更はブロックの外には現れません。これらの変数が __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 であり、この変更はブロックの外側で見ることができる。