iOS中block初体验

来源:互联网 发布:分体式集成灶 知乎 编辑:程序博客网 时间:2024/05/08 20:43

小白一枚,被block代理什么的折磨了好久,到现在也没有完全弄明白block是怎么一回事,今天在看李明杰老师视频学习的时候总结了一些基本概念,不对的地方,还请众神指点呀。

block书写格式:
返回值类型(^ block名称)(参数列表)=^{代码块}

下面先一步步 从无返回值无参数 到有返回值有参数的block开始
1. 首先看一个无返回值无参数
例:

1.1 void(^myblock)( ) ; myblock=^{                        NSLog(@"+++++++");              }myblock( );    //调用部分1.2(和1.1作用相同)void(^myblock)( ) ; myblock=^{                        NSLog(@"+++++++");              }myblock( );    //调用部分

详解:
先理解它的这个结构 以等号左右说明 定义部分=赋值部分
{}内的才为代码块
第4行才是这个block的调用部分 此时2行才真正的执行。

2. 有参数有返回值的block
我始终搞不懂为什么要用到block 尽管百度出各种好处但是没有码代码光理解 确实记一次忘一次熊瞎子掰苞米来着。
下面有这样一个需求,要有一个只执行加法的盒子 相当于计算器,每次我只负责填两个数字加到盒子里 结果则由盒子给我输出来。
下面这样操作,我要设置这个盒子,他的内部功能就是执行加法操作 入口呢则是我向盒子里面填两个数字 出口则是他执行完输出结果。

这里的
第1步 输入过程就是输入参数
第2步 就是代码块
第3部 就是调用代码块部分。
码代码过程 如果开始学习 建议先从第2部分也就是等号右边开始写,这部分是需要重复执行的代码,就是那个运算过程,然后再声明一个block对象,并把等号右边的赋值给这个对象。
好啰嗦 看代码吧

    int(^mumblock)(int,int);  //定义 block类型;声明block对象mumblock部分 相当于int a;    mumblock=^(int a, int b){  //赋值部分 相当于int a =3;        return a-b;            //代码块部分    };    NSLog(@"%d",sumblock(10,20));//调用部分    //输出结果 30 

block其实和NSString一样 需要定义对象( =号左侧) ,给对象赋值(=号右侧)。
调用部分 可以循环n次 是不是很方便?! 不用每次都写{}里面的内容了?!
详解:

    /// 需求是计算a+b          1 写出{  }内的内容,    /// 需求传参数          2 所以在{  }左侧写上^(int a,int b)     /// 需要将现在的block赋值给一个block类型变量 先去声明变量(下面��)    /// 声明block类型变量          3 int(^mumblock)(int,int);    /// 将2种定义的代码块(对象值) 赋值给声明的block类型的变量mumblock;          4 sumblock=^(int a,int b){        return a+b;    };    ///   完整的block     int (^sumblock)(int,int)=^(int a,int b){        return a+b;    };    NSLog(@"%d",sumblock(10,20));

3.还有一个typedef的问题 这有问题的话 大概就是因为没有搞懂block 谁是对象 谁是数据类型。typedef的作用 就是重新定义一个数据类型 。
先看代码

int(^sumBlock)(int,int)=^(int a,int b){ //block类型定义        return a+b;    };int(^subBlock)(int,int)=^(int a, int b){//block类型定义        return a-b;    };int(^mulBlock)(int,int)=^(int a, int b){//block类型定义        return a*b;    };//调用 NSLog(@"%d,%d,%d",sumblock(10,20),subblock(10,5),mulBlock(3,3)); 输出结果:3059

发现规律没?第1行 定义block类型的时候,重复相同代码,也就是sumBlock、subBlock、subBlock三个block对象 用的是相同的block数据类型来定义的,就好比nsstring定义3个对象一样。
因为block类型重复 需要重复写 然而程序员又是那么聪明(lan)所以就用typedef来重新定义block的数据类型。看代码 。

typedef int(^MyTypedefBlock)(int,int); MyTypedefBlock sumBlocl=^(int a,int b){        return a+b;    }; MyTypedefBlock subBlocl== ^(int a,int b){        return a-b;    }; MyTypedefBlock mubBlocl== ^(int a,int b){        return a*b;    };//调用 NSLog(@"%d,%d,%d",sumblock(10,20),subblock(10,5),mulBlock(3,3)); 输出结果:3059// 两种结果相同 所以不要乱 首先明白 那个是block的数据类型是什么,再知道这个类型定义的对象是谁,谁又给这个对象赋值的。typedef只是减少了代码 看起来更清楚了。

End : litter white 刚刚开始iOS开发工作,希望和大家共同学习。
写的内容主要是给和我一样的小白们相互了解学习的,路过大神多指导哈。

1 0