iOS中block 静态全局局部变量block变量


#import 
int gNum = 100;
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        static int sNum = 100;
        __block int bNum = 100;
        int lNum = 100;
        int (^sum)(int, int) = ^(int a, int b) {
            NSLog(@"%d %d %d %d",sNum,gNum,lNum,bNum);
            sNum++;
            bNum++;
            gNum++;
            return a + b   + lNum + gNum + sNum + bNum ;  
        };
        sNum = 1;
        bNum = 1;
        gNum = 1;
        lNum = 1;

        NSLog(@"%d",sum(1,2));
        NSLog(@"%d",sNum);
        NSLog(@"%d",bNum);
        NSLog(@"%d",gNum);
        NSLog(@"%d",lNum);

    }
    return 0;
}

打印结果

2016-04-01 15:57:09.984 xxx[10180:2208151] 109
2016-04-01 15:57:09.984 xxx[10180:2208151] 2
2016-04-01 15:57:09.984 xxx[10180:2208151] 2
2016-04-01 15:57:09.984 xxx[10180:2208151] 2
2016-04-01 15:57:09.984 xxx[10180:2208151] 1

Block作为C语言的扩展,并不是高新技术,和其它语言的闭包或lambda表达式一样。由于Objetive-C在iOS中不支持GC机制,使用Block必须自己管理内存,而内存管理正是使用Block坑最多的地方,错误的内存管理要么导致return cycle(循环引用)内存泄漏要么内存被提前释放导致crash。Block的使用很像函数指针,不过与函数最大的不同是:Block可以访问函数以外,词法作用域以内的外部变量的值。也就是说,Block不仅实现函数的功能,还能携带函数的执行环境。
可以这样理解,Block其实包含两个部分内容
1.Block执行的代码,这是在编译的时候已经生成好的;
2.一个包含Block执行时需要的所有变量值的数据结构。Block将使用到的,作用域附近的变量的值建立一份快照拷贝到栈上。
Block与函数另一个不同是,Block类似Objc的对象,可以使用自动释放池管理内存
3 Block对外部变量的存取管理
基本数据类型
1,局部变量
局部自动变量,在Block中只读。Block定义时copy变量的值,在Block中作为常量使用,所以即使变量的值在Block外改变,也不影响他在Block中的值。
2, static修饰符的静态变量或全局变量
因为全局变量货静态变量在内存中的地址是固定的,Block在读取改变量值的时候是直接从其所在的内存读出的,获取daode 是最新值,而不是在定义时copy的常量。
3,__block修饰的变量
block变量,在被__block修饰的变量称作Block变量。基本类型的Block变量等小雨全局变量或静态变量。

你可能感兴趣的:(ios)