Block是OC中一种与其它语言的语法区别较大的一种用法,需要注意:
- Block也叫代码段,它封装了一段代码,可以在任何时候执行;
- Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值;
- 它和传统的函数指针很类似,但也有区别:block是inline(内联函数)的,并且默认情况下它对局部变量时只读的;
- Apple建议尽量多使用block;
- 在多线程、异步任务、集合遍历、集合排序、动画转场中用的较多。
Block有两种使用方法:
1.直接定义一个block
// 定义了一个block,这个block返回值是int类型,接收两个int类型的参数 int (^Sum) (int, int) = ^(int a, int b) { return a + b; }; //调用block int a = Sum(10 ,11); NSLog(@"%i", a);
2.先用typedef定义block类型,再用该block类型定义具体的block
typedef int (^Oper) (int, int); int main(int argc, const char * argv[]) { @autoreleasepool { //声明了一个block变量,做加法功能 Oper add = ^(int a, int b) { return a + b; }; NSLog(@"%i", add(10, 10)); //声明了一个block变量,做减法功能 Oper sub = ^(int a, int b) { return a - b; } NSLog(@"%i", sub(10, 10)); } return 0; }
这样使用更具灵活性,可以定义一类操作类型,再利用这种操作类型定义具体的操作,比如我还可以继续定义乘法和除法的block。
Block可以访问局部变量,但是不能改变它,如果需要修改,需用__block作特殊声明:
// __block有2个下划线 __block int c = 15; // 声明了一个block变量 Oper add = ^(int a, int b) { // 如果外部的变量用了__block关键字,就可以在block内部修改这个变量 c = 19;//如果不加__block声明,这句会报错,只能打印c的值 // block可以访问外面定义的变量 NSLog(@"c is %i", c); return a + b; };