block
1、block是一种数据类型, 可以使用这种数据类型定义变量, 并赋值。
block数据类型在使用前需要先定义该数据类型, 然后再使用(就像使用Person类一样, 先
定义一个Person类, 然后再通过Person类声明一个Person类型变量)。
block这种数据类型用来保存一个方法、函数、一段代码
使用inlineBlock辅助编写block代码
int (^block)(int,int) = ^(int n, int m){};
2、block的基本概念
Block对象是一个C级别的语法和运行机制。它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。因此,Block对象包含着一组状态数据, 这些数据在程序执行时用于对行为产生影响。
你可以用Block来写一些可以传到API中的函数语句,可选择性地存储,并可以使用多线程。 作为一个回调,Block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间需要 的数据。
3、block的基本用法
用^操作符来声明一个Block变量,并指明Block述句的开始。Block的主体部分包含在{}内,像下面的例子中一样(与C语法一样,“;”指明语句的结束):
4、block的typedef
可以使用typedef定义一个Block的类型,便于在后续直接使用
格式: typedef 返回值类型 (^block变量名)(参数类型列表);
5、block访问外部变量
1)在block内部可以访问block外部的变量
block内部也可以定义和block外部的同名的变量(局部变量),此时局部变量会暂时屏蔽外部变量的作用域
2)在block内部不可以修改block外部的变量
默认情况下,Block内部不能修改外部的局部变量
给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。
6、block作为函数的返回值
步骤: 1)使用typedef定义一个新的类型
//给block起一个别名
typedef int(^newType)(int num1,int num2);
2)使用新类型作为函数的返回值
//定义一个返回值是block类型的函数
newType test4()
{
//定义一个newType 类型的block变量
newType work1=^(int x,int y)
{
return x+y;
};
return work1;
}
3)定义变量接收函数返回的值(block类型)
4)调用block
7、block和函数的区别:
1)定义方式不一样;
2)block是一种数据类型;
3)函数不可以嵌套使用,block可以嵌套使用;
4)block因为是数据类型,所以可以作为函数的参数和返回值;
5)函数则不可以作为函数的参数或者返回值。 |
|