Block

 

//定义一个求两个数最大值函数

int maxValue (int ,int);

//函数的实现

int maxValue (int a, int b){

    return  a > b ? a : b;

}

//函数指针 (调用可以用 p 或者 maxValue

        int (* p)(int,int) = maxValue;

        int max =  p(24, 48);

block是一个匿名函数,也是一个函数,只不过没有名字而已。也叫语法块。

把函数名去掉剩余的部分就是函数类型。

对于Block 的定义:

         函数的返回值类型 ^ block 变量名)(参数列表)= ^ 返回值类型(可以省略)(参数列标(形参名不可以省略)){

         }

 Block 的类型 int (^)(int ,int)      //就是把变量名去掉后的部分

         Block 的变量名:

//定义一个无参数无返回值的 block

 //无参数时,小括号不能省去

        void (^ sayHi)() = ^void(){

            NSLog(@"hellow");

        };

        sayHi();

//有参数无返回值的block

        void (^ sayHi1)(int a) = ^ (int a){//block的定义

            NSLog(@"%d",a);

        };

        sayHi1(5);//block的调用

 //定义一个block 实现把数字字符串转化为整数

        int (^ exchangeCagrToInt)(NSString *) = ^ int(NSString * array){

            int n = [array intValue];

            return n;

        };

       //OC对象作为参数使用

        int c = exchangeCagrToInt(@"13");//如果写的是 123ABC 只会打印123  如果是 abc A 之类的就会打印出0,所以以后使用的时候要注意

        NSLog(@"%d",c);

 

 //对比C语言的函数指针

        //block 进行重命名(是给block变量类型重名名)

        typedef int (^ ValueOfTwo)(int,int);

        //ValueOfTwo 指向 返回值为 int 有两个 int 参数的 bloc 类型的 block

      ValueOfTwo newBlock = ^(int a ,int b){//此时  newBlock 求两个数的和

            return a + b;

        };

//注意

        int number = 20;

        void (^myblock)(int ) = ^(int num){

            NSLog(@"%d",num);

            NSLog(@"%d",number);

            //number 赋新值

            //number = number - num;//这里会报错,因为在block内部不能修改局部变量的值,但是可以访问局部变量的值

        };

        myblock(10);

 __block int number = 20;//这样让block内部可以改变我们定义的局部变量

        void (^myblock)(int ) = ^(int num){

            NSLog(@"%d",num);

            NSLog(@"%d",number);

            //number 赋新值

            number = number - num;//这里不报错,因为在局部变量的值前面加上了修饰符 “__block” 注意是两个下划线哦,但是可以访问局部变量的值

        };

        myblock(10);

//我们称 ^ 为 托字符

  1 //
  2 //  main.m
  9 #import <Foundation/Foundation.h>
 10 
 11 //定义一个求两个数最大值函数
 12 int maxValue (int ,int);
 13 //函数的实现
 14 int maxValue (int a, int b){
 15     return  a > b ? a : b;
 16 }
 17 int main(int argc, const char * argv[]) {
 18     @autoreleasepool {
 19         // insert code here...
 20         NSLog(@"Hello, World!");
 21         //函数指针 (调用可以用 p 或者 maxValue)
 22         int (* p)(int,int) = maxValue;
 23         int max =  p(24, 48);
 24         //Block:匿名函数 也是一种函数  只不过是特殊的函数(匿名函数)
 25         /*
 26          对于Block 的定义:
 27          函数的返回值类型 (^ block 变量名)(参数列表)= ^ 返回值类型(可以省略)(参数列标(形参名不可以省略)){
 28          };
 29          */
 30 //        int (^ maxOfTwo)(int, int) = ^ int(int a,int b){
 31 //            return a > b ? a :b;
 32 //        };
 33         int (^ maxOfTwo)(int, int) = ^ (int a,int b){
 34             return a > b ? a :b;
 35         };
 36         /*
 37          Block 的类型 :int (^)(int ,int)      //就是把变量名去掉后的部分
 38          Block 的变量名:
 39          */
 40         int result = maxOfTwo (12,10);
 41         NSLog(@"%d",result);
 42         int (^ mutil)(int ,int) = ^int (int a,int b){
 43             return a*b;
 44         };
 45         int ji = mutil(12 ,4);
 46         NSLog(@"%d",ji);
 47         //定义一个无参数无返回值的 block
 48         //无参数时,小括号不能省去
 49         void (^ sayHi)() = ^void(){
 50             NSLog(@"hellow");
 51         };
 52         sayHi();
 53         //有参数无返回值的block
 54         void (^ sayHi1)(int a) = ^ (int a){
 55             NSLog(@"%d",a);
 56         };
 57         sayHi1(5);
 58         //block的定义
 59         void (^ printNum)(int a) = ^ void (int a){
 60             NSLog(@"%d",a);
 61         };
 62         //block的调用
 63         printNum(10);
 64         
 65         
 66         //定义一个block 实现把数字字符串转化为整数
 67         int (^ exchangeCagrToInt)(NSString *) = ^ int(NSString * array){
 68             int n = [array intValue];
 69             return n;
 70         };
 71         int c = exchangeCagrToInt(@"13的是否合格");
 72         NSLog(@"%d",c);
 73         //对比C语言的函数指针
 74         //对block 进行重命名(是给block变量类型重名名)
 75         typedef int (^ ValueOfTwo)(int,int);
 76         //ValueOfTwo 指向 返回值为 int 有两个 int 参数的 bloc 类型的 block
 77         ValueOfTwo newBlock = ^(int a ,int b){
 78             return a + b;
 79         };//此时  newBlock 求两个数的和
 80         int bb = newBlock(10,12);
 81         NSLog(@"%d",bb);
 82         ValueOfTwo newMulBlock = ^(int a,int b){
 83             return a*b;
 84         };
 85         int bc = newMulBlock(10,12);
 86         NSLog(@"%d",bc);
 87         
 88         
 89         //block访问外面定义的局部变量
 90         __block int number = 20;
 91         void (^myblock)(int ) = ^(int num){
 92             NSLog(@"%d",num);
 93             NSLog(@"%d",number);
 94             //number 赋新值
 95             number = number - num;//这里不报错,因为在局部变量的值前面加上了修饰符 “__block” 注意是两个下划线哦,但是可以访问局部变量的值
 96             
 97         };
 98         myblock(10);
 99     }
100     return 0;
101 }
  block定义

相关文章: