Block 对外部变量的存取管理
基本数据类型
1、局部变量
局部自动变量,在 Block 中只读。Block 定义时 copy 变量的值,在 Block 中作为常量使用,所以即使变量的值在 Block 外改变,也不影响他在 Block 中的值。
{
int base = 100;
long (^sum)(int, int) = ^ long (int a, int b) {
return base + a + b;
};
base = 0;
printf("%ld\n",sum(1,2));
// 这里输出是103,而不是3, 因为块内base为拷贝的常量 100
}
2、STATIC 修饰符的全局变量
因为全局变量或静态变量在内存中的地址是固定的,Bloc k在读取该变量值的时候是直接从其所在内存读出,获取到的是最新值,而不是在定义时 copy 的常量.
{
static int base = 100;
long (^sum)(int, int) = ^ long (int a, int b) {
base++;
return base + a + b;
};
base = 0;
printf("%ld\n",sum(1,2));
// 这里输出是4,而不是103, 因为base被设置为了0
printf("%d\n", base);
// 这里输出1, 因为sum中将base++了
}
3、__BLOCK修饰的变量
Block 变量,被 __block
修饰的变量称作 Block 变量。 基本类型的 Block 变量等效于全局变量、或静态变量。
注:BLOCK 被另一个 BLOCK 使用时,另一个 BLOCK 被 COPY 到堆上时,被使用的 BLOCK 也会被 COPY。但作为参数的 BLOCK 是不会发生 COPY 的。