block与函数类似:1.可以保存代码 2.又返回值 3.有形参 4.调用方式一样
block的标志:^
一、定义一个无参无返回值的block
void (^myBlock)();--1.void 代表这个block变量没有返回值 2.最右边的括号(),代表block的参数,没有参数的话就为空
3.中间的括号中^是block的标志,myBlock是block变量的名字
二、定义一个接收两个int类型数据返回int类型的block
int (^myBlock)(int,int);
代码示例:
1 // 定义一个block变量 2 int (^sumBlock)(int,int); 3 // 给定义的block变量赋值 4 sumBlock = ^(int a,int b) 5 { 6 return a+b; 7 };
三、block中访问和修改变量的问题
1.block内部可以访问外面的变量
2.默认情况系,block内部不能修改外面的局部变量
3.给局部变量加上__block关键字(两个下划线),这个局部变量就可以在block内部修改
代码示例:
1 void test3() 2 { 3 int a = 10; 4 __block int b = 20; 5 6 void (^block)(); 7 8 block = ^{ 9 // block内部可以访问外面的变量 10 //NSLog(@"a = %d", a); 11 12 // 默认情况下,block内部不能修改外面的局部变量 13 // a = 20; 14 15 // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改 16 b = 25; 17 }; 18 19 20 block(); 21 }
四、OC中的方法没有重载这一说,但是当遇到两个或两个以上的block的参数和返回值类型都一样的情况下,解决方法为利用typedef定义block类型,如下:
typedef int (^MyBlock)(int,int);--这句代码定义了一个接受两个int类型参数,返回int的MyBlock类型
调用:MyBlock sumBlock = ^(int a ,int b){ return a + b ; };