Sian 发表于 2014-3-21 11:45:38

Block的基本使用以及与函数的区别

1、定义Block变量:返回值类型 (^变量名称) (形参...);
      void (^b)( );
2、定义Block代码块:^(形参...){   block体(代码块)   };
   带形参的:
      ^(int n1, intn2) {
                return n1 + n2;
      };

   不带形参的:
      ^( ) {
                NSLog(@"--------");
      };

   无形参括号可省略
      ^ {
                NSLog(@"--------");
      };
3、typedef重定义Block类型:返回值类型 (^新类型名) (形参...),与定义函数指针非常类似:返回值类型 (*指针变量) (形参...),返回值类型、形参的个数与类型决定了该Block类型能够定义何种类型的Block变量,函数指针也一样,返回值类型、形参的个数与类型决定了该指针能够指向何种类型的函数;
      typede void(^Myblock) ( );
      Myblock b = ^{
                NSLog(@"---------");
      };

代码参考:
//
//main.m
//Block
//
//Created by yusian on 14-3-20.
//Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//

#import <Foundation/Foundation.h>

// 定义一个"返回值为空,无形参"类型的函数指针类型:Myfun
typedef int (*Myfun)(int, int);

// 定义一个"返回值为空,无形参"类型的block指针类型:Myblock
typedef int (^Myblock)(int, int);

void test();

int sum(int n1, int n2);

int main()
{
   
/******************************************************/
    // 定义一个无返回值无形参的block类型数据b;
    void (^block)();
   
    // 给b赋值
    block = ^() {
      NSLog(@"Block--------------!");
    };
   
    /**********************************
   以上两句可以合成一句
   void (^b)() = ^(){
      NSLog(@"Block--------------!");
   };
   
   无形参还可以简写为
   void (^b)() = ^ {
      NSLog(@"Block--------------!");
   };
   **********************************/
   
/******************************************************/
   
    // 调用函数test
    test();
   
    // 调用block b
    block();
   
/******************************************************/
   
    // 定义一个Myfun类型的变量f并赋值,Myfun类型实际上为函数指针,上面有typedef定义
    Myfun f = sum;
   
    // 使用f进行传参即为调用sum函数,将返回值传给int变量s
    int s1 = f(3, 4);

    // 输出结果
    NSLog(@"函数调用结果:s1 = %d", s1);
   
    // 对比函数指针,同样将一个^ (int, int)赋值给Myblock类型变量b,Myblock类型上面有typedef定义
    Myblock b = ^ (int n1, int n2) {
      return n1 + n2;
    };
   
    // 使用b进行传参即为调用上述block,将返回值传给int变量s1
    int s2 = b(3, 4);
   
    // 输出结果
    NSLog(@"Block调用结果:s2 = %d", s2);
   
    return 0;
}

// 定义一个无返回值无形参的函数test
void test()
{
    NSLog(@"Function-----------!");
}

// 定义一个返回值为int类型,带两个int型形参的函数sum
int sum(int n1, int n2)
{
    return n1 + n2;
}运行结果:2014-03-21 11:22:04.568 Block Function-----------!2014-03-21 11:22:04.570 Block Block--------------!2014-03-21 11:22:04.570 Block 函数调用结果:s1 = 72014-03-21 11:22:04.571 Block Block调用结果:s2 = 7Program ended with exit code: 0
页: [1]
查看完整版本: Block的基本使用以及与函数的区别