あなたの例の非正統的な構文にもかかわらず、これはポイントを説明するためだけに考案されたものだと思いますが、それらが定義されているレキシカルスコープからキャプチャ状態をブロックすることは正しいです。内部の詳細については、ブロックの内部に関する Mark Dalrymple の 投稿をご覧ください。
通常、周囲のスコープからの変数には、ブロック内の値渡しのセマンティクスと__block
修飾子による参照渡しのセマンティクスがあります。したがって、これは例外をスローするコンパイルしない(EDIT 2012-09-27 20-52-51) :
#import <Foundation/Foundation.h>
typedef int (^IntBlock)();
int main(int argc, char *argv[]) {
NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];
int n = 5;
IntBlock alwaysEleven = ^{
n++;
printf("n inside the block: %d\n",n);
return 11;
};
int d = alwaysEleven(n);
printf("result = %d, n = %d", d,n);
[p release];
}
しかし、宣言__block int n = 5;
した場合、そうではありません。
@leo は、ブロックの使用を開始することを提案しました。ブロックがどのように状態をキャプチャするか、およびキャプチャされた状態が存在する場所 ( までスタック上Block_copy()
) に関心がある場合は、ドキュメントのブロック プログラミング トピックを読む価値があります。