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内部改变量是只读的。