——黑马程序员——OC中block访问外部变量

-----------android培训java培训、java学习型技术博客、期待与您交流!-----------

OC中block访问外部变量

一、在block内部访问外部变量

int main(int argc, const char *argv[]) { 

@autoreleasepool {

int m = 10;

NSLog (@"m = %d", m);                //

NSLog (@"m的地址 = %p", &m); // 栈区

//定义变量,并赋值

void (^Block) () = ^{

// 在代码块内部定义 int m = 10; //栈区

//在block内部 m的值不允许修改

//内部访问外部m的值

NSLog (@"在block中访问:m = %d", m);

NSLog (@"在block中地址:&m = %p", &m); // block中的m存在堆区

};

//使用block变量

Block(); //此时打印出了blcok中的m值和地址

}

}

1、当Block被定义创建的时候,会以const的方式把外部变量栈区的m值拷贝到block所在的内存中(本程序是在堆区),以const方式拷贝的值是不允许修改的,

2、在block内部定义的变量存在栈区

3、在block内部访问外部变量,给变量加__block后可以修改变量值,因为__block 会不再以const常量的方式进行拷贝,修改变量值后,block及以后的代码使用的空间是堆区的空间,不再是栈区空间

二、block使用注意事项

1、block有全局block, 栈block,堆block之分,

2、全局变量在block内部可以修改

3、堆区block是对栈区的block拷贝来的,

4、block内部变量是只读的,修改时 需要给变量加__block

三、block作为函数的返回值

1、使用typedef 定义一个新的类型,给block变量起个别名

2、用新定义的类型作为函数的返回值

3、 定义block变量接收函数的返回结果

4、执行block

例:

//   (1)使用typedef 定义一个新的类型,给block变量起个别名

typedef void (^newType)();

// (2) block 类型作为函数返回值,newType是类型值

newType Test(){ 

newType w = ^{

NSLog(@"******");

NSLog(@"#####");

};

return  w;

};

// 主函数

int main (int atrc,  const char *argv[]) {

@autoreleasepool{

//(3) 定义block类型的变量接收返回结果

newType n = test();

//  执行block

n ();

}

return 0;

}

四、block的使用技巧和注意事项

1、block助记符:inline

2、定义block变量的时候,形参类型及个数处可以加上形参名称

3、当作为方法的参数的时候 返回值类型必须写上


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值