ios中block访问外部变量的一些注意点

时间:2021-08-04 12:24:18

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

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

  由于Objective-C 和 C++ 都是衍生自C,block被设计为可同时兼容这三种语言,今天主要来说说block访问外部变量的一些东西!

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

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

ios中block访问外部变量的一些注意点
但是要注意,这是一个新的内存空间变量

ios中block访问外部变量的一些注意点

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

ios中block访问外部变量的一些注意点

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

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

ios中block访问外部变量的一些注意点

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

ios中block访问外部变量的一些注意点

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

ios中block访问外部变量的一些注意点

注意:

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

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

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