关于block访问外部变量的一些小注意点

       Block类型是一个C级别的语法和运行机制。它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。因此,Block对象包含着一组状态数据,这些数据在程序执行时用于对行为产生影响。 

  你可以用Block来写一些可以传到API中的函数语句,可选择性地存储,并可以使用多线程。作为一个回调,Block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间需要的数据。 

  由于Objective-C 和 C++ 都是衍生自C,block被设计为可同时兼容这三种语言。

       今天主要来说说block访问外部变量的一些东西!

1)在block内部可以访问block外部的变量

在block内部可以使用外部变量


但是要注意,这是一个新的内存空间变量 



block内部也可以定义和block外部的同名的变量(局部变量),此时局部变量会暂时屏蔽外部变量的作用域


2)在block内部不可以修改block "外部的变量"

  非局部变量会以const变量被拷贝并存储到block中,也就是说在block中是只读的。如果尝试在block内部给m变量赋值,会抛出编译器错误。




  冻结中的非局部变量是一个常量值,这也是一种默认的安全行为——因为这可以防止在block中的代码对非局部变量做了意外的修改。



给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。 

注意:

1、静态变量和全局变量在加和不加__block都会直接引用变量地址。也就意味着可以修改变量的值。在没有加__block关键字的情况下。

2、常量变量(NSString *a=@"hello"; a为变量,@“hello”为常量。)
  不加__block类型,block会直接取常量值(浅拷贝)。
  加__block类型,block会去引用变量的地址。(如:a变量,a = @"abc".可以任意修改a 指向的内容。)

如果不加__block 直接在block内部修改变量 ,会编译报错。block内部改变量是只读的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值