陈斌彬的技术博客

Stay foolish,stay hungry

Block 对外部变量的存取管理

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 的。