尽管您的示例的非正统语法 - 我认为这只是为了说明一点 - 块从定义它们的词法范围捕获状态是正确的。有关内部结构的更多信息,请查看 Mark Dalrymple 关于块内部结构的这篇文章。
通常,来自周围范围的变量在块内具有按值传递的语义,而在__block
修饰符下具有按引用传递的语义。因此,这将抛出异常不编译(编辑 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 建议使用 Blocks 入门。如果您对块如何捕获状态以及捕获的状态的位置(在堆栈上直到Block_copy()
)感兴趣,那么文档中的块编程主题是值得一读的。