Objective-C のキーワードは正確にはどういう__block
意味ですか? ブロック内の変数を変更できることは知っていますが、知りたいことがあります...
- コンパイラーに正確に何を伝えるのでしょうか?
- 他に何かできますか?
- それがすべてであるなら、そもそもなぜそれが必要なのでしょうか?
- ドキュメントのどこかにありますか? (見つかりません)。
ベストアンサー1
は、 でマークされた変数はブロック内で使用されるときに特別な方法で処理する必要があることをコンパイラに指示します。通常、ブロック内でも使用される変数とその内容はコピーされるため、これらの変数に加えられた変更はブロック外には表示されません。 でマークされている場合__block
、ブロック内で行われた変更はブロック外でも表示されます。
例と詳細については、__block ストレージタイプApple のBlocks プログラミングトピックで。
重要な例は次のとおりです。
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
が変更されます。ただし、ブロック内では、キーワードlocalCharacter
のおかげで への変更のみが表示されます__block
。逆に、ブロックは を変更できlocalCharacter
、この変更はブロックの外部で表示されます。