当block时,如果里面用到外部变量,会先把外部变量从栈区【以const的方式拷贝】到【堆区(block是对象,一般在堆区)】。因此可以访问外部变量的值,但是无法改变外部变量的值。
【例如】 - //定义一个外部变量
- int sum = 2;
- //定义一个有参有返回值的block的别名
- typedef int (^myBlock)(int, int);
- //此时myBlock是一个类型,不再是一个单纯的变量了
- NSLog(@"sum = %p",&sum);//此时sum在栈区
- //当block时,如果里面用到外部变量,会先把外0部变量从栈区【以const的方式拷贝】到【堆区(block是对象,一般在堆区)】。
- myBlock b1 = ^(int a, int b){
- NSLog(@"sum = %p",&sum);//此时的地址不在栈区,而在堆区
- //sum = a + b;//不能改变sum的值,会报错
- //可以外部变量sum的值
- return sum + a + b;
- };
- NSLog(@"sum = %p",&sum);//此时sum在栈区
- NSLog(@"a + b = %d", b1(1,2));
- NSLog(@"sum = %p",&sum);//此时sum在栈区
[color=rgb(177, 8, 0) !important]复制代码
|