OC学习4——OC新特性之块(Block)
文章主要参考 关于OC中的block自己的一些理解(一)
对块的深入理解 浅析ios开发中Block块语法的妙用
1、关于block
block的作用:保存一段代码。
苹果官方推荐的一种语法,类似于C语言的函数,但是比函数更加灵活。
^是block语法的标识。
2、在Object-C中,块被当做一个对象来处理,这个对象可以:
有自己的局部变量
可以传入参数
有返回值
可以访问自己定义时的上下文变量
可以修改自己定义时特定的上下文变量
作为参数传递给其它函数
3、block的基本语法
4、block的使用
- 无返回值无参数
1 - (void)myFirstBlock 2 { 3 //1.定义block 4 void (^myblock)() = ^{ NSLog(@"无参数无返回值"); }; 5 6 //2.调用block 7 myblock(); 8 } 9 10 //输出结果:2016-02-18 09:56:50.124 01-block[750:25107] 无参数无返回值
-
有参数没有返回值
1 - (void)mySecondBlock 2 { 3 //1.定义block 4 void (^mySecondBlock)(int,int) = ^ (int num1,int num2){ 5 NSLog(@"有参数无返回值:%d",num1 + num2); 6 }; 7 8 //2.调用block 9 mySecondBlock(2,3); 10 } 11 12 //输出结果:2016-02-18 10:03:22.221 01-block[811:30160] 有参数无返回值:5
- 有参数有返回值
1 - (void)myThirdBlock 2 { 3 //1.定义block 4 double (^myThirdBlock)(double,double) = ^ (double r1,double r2){ 5 return r1 + r2; 6 }; 7 8 //2.调用block 9 double r3 = myThirdBlock(1.1,2.2); 10 NSLog(@"有参数有返回值:%f",r3); 11 } 12 13 //输出结果:2016-02-18 10:06:42.615 01-block[861:32505] 有参数有返回值:3.300000
5、block的注意点
- Block内部可以访问外部变量
- 默认情况下,Block内部不能修改外部的局部变量
- 给局部变量加上 _block 关键字,则这个局部变量可以在block内部进行修改
1 - (void)myFourBlock 2 { 3 //int num = 5; 4 __block int num = 5; 5 void (^myFourBlock)() = ^{ 6 7 num = 6; 8 NSLog(@"%d",num); 9 }; 10 myFourBlock(); 11 }
上述代码中如果num的定义才用第3行的方式,则在运行第六行时会报错:missing __block type specifier; ,才用第4行的定义则可以正确输出:2016-02-18 10:25:02.195 01-block[1016:45943] 6
6、整体应用代码
1 #import <Foundation/Foundation.h> 2 3 typedef int (^MyBlock)(int,int); // block类型 4 5 int cc =9 ; 6 int main(int argc, const char * argv[]) { 7 8 int a = 20 ; 9 __block int b = 100 ; 10 void (^voidBlock)() = ^{ 11 NSLog(@"------------"); 12 //在bloc体内不能修改非__block声明的局部变量,可以修改全局变量和用__block声明的局部变量 13 //a = 10; 14 b = 50 ; 15 cc = 111; 16 }; 17 NSLog(@"%d %d %d",a,b,cc); 18 voidBlock(); 19 NSLog(@"%d %d %d",a,b,cc); 20 21 22 23 24 int (^sumBloc)(int , int); 25 sumBloc= ^(int a,int b){ 26 27 return a+b; 28 }; 29 int (^subBloc)(int,int) = ^(int a,int b){ 30 return a - b ; 31 }; 32 33 int sum = sumBloc(10,90); 34 int sub = subBloc(10,90); 35 36 NSLog(@"sum = %d sub = %d",sum,sub); 37 38 voidBlock(); 39 40 41 //------ typedef block类型用法------------ 42 43 MyBlock sum1 = ^(int a,int b){ 44 return a + b ; 45 }; 46 47 MyBlock sub1 ; 48 sub1 = ^(int a ,int b){ 49 return a - b ; 50 }; 51 52 NSLog(@"sum1 = %d sub1 = %d",sum1(10,20),sub1(20,10)); 53 54 return 0; 55 }