A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qinyawan 初级黑马   /  2015-11-24 14:18  /  797 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


当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]复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马