OC学习4——OC新特性之块(Block)

文章主要参考  关于OC中的block自己的一些理解(一)

对块的深入理解  浅析ios开发中Block块语法的妙用

1、关于block

block的作用:保存一段代码。

苹果官方推荐的一种语法,类似于C语言的函数,但是比函数更加灵活。

^是block语法的标识

2、在Object-C中,块被当做一个对象来处理,这个对象可以: 

有自己的局部变量

可以传入参数

有返回值

可以访问自己定义时的上下文变量

可以修改自己定义时特定的上下文变量

作为参数传递给其它函数

3、block的基本语法

4、block的使用

  1. 无返回值无参数
     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] 无参数无返回值
  2. 有参数没有返回值

     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
  3. 有参数有返回值
     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的注意点

  1. Block内部可以访问外部变量
  2. 默认情况下,Block内部不能修改外部的局部变量
  3. 给局部变量加上 _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 }

 

posted on 2017-08-10 09:34  mukekeheart  阅读(445)  评论(0编辑  收藏  举报