__block说明符
若想在Block语法的表达式中将值赋给在Block语法外面声明的局部变量,需要在自动变量前面附加__block说明符。
__block int val = 0;
void (^blk)(void) = ^{val = 1;};
blk();
printf("val = %d\n",val);
复制代码
当截获的是Objective-C对象,调用变更该对象的方法则不会出现错误
id array = [[NSMutableArray alloc] init];
void (^blk)(void) = ^{
id obj = [[NSObject alloc] init];
[array addObject:obj];
};
复制代码
但是,如果我们重新给array赋值,就会报错。 可以理解为,对于OC对象,在block里面使用是可以的,但是如果想重新赋值,需要前面添加 __block
:
__block id array = [[NSMutableArray alloc] init];
void (^blk)(void) = ^{
id obj = [[NSObject alloc] init];
[array addObject:obj];
};
复制代码
C语言数组
const char text[] = "hello";
void (^blk)(void) = ^{
printf("%c\n",text[2]);
};
复制代码
这里只是使用C语言字符串字面量数组,而并没有向截获的变量赋值,但是解惑自动变量的方法并没有实现对C语言数组的截获,所以这里会报错;这里可以使用指针解决该问题:
const char *text = "hello";
void (^blk)(void) = ^{
printf("%c\n",text[2]);
};
复制代码